簡體   English   中英

在Razor ASP.NET MVC中調用方法

[英]Calling a method in Razor ASP.NET MVC

我是MVC的新手,無法在視圖輸入字段中顯示某種方法的結果。 我不太確定是否應該在cshtml或單獨的cs文件中創建方法。

我已經使用@function標記在下面的cshtml文件中創建我的方法

@functions{

    public int DaysCalc(DateTime first, DateTime second)
    {
        QuoteApp.Models.Quote ts = new QuoteApp.Models.Quote();
        ts.StartDate = first;
        ts.EndDate = second;

        int days;
        days = (second.Day - first.Day);
        return days;


    }

}

我在cshtml文件中這樣稱呼它

 @Html.EditorFor(model =>model.DaysCalc(model.StartDate, model.EndDate), new { htmlAttributes = new { @class = "form-control", disabled = "disabled"} })

我收到一個錯誤說明

模板只能與字段訪問,屬性訪問,一維數組索引或單參數自定義索引器表達式一起使用。

說明:執行當前Web請求期間發生未處理的異常。 請查看堆棧跟蹤,以獲取有關錯誤及其在代碼中起源的更多信息。

異常詳細信息:System.InvalidOperationException:模板只能與字段訪問,屬性訪問,一維數組索引或單參數自定義索引器表達式一起使用。

源錯誤:

Line 63:             @Html.LabelFor(model => model.noOfDays, htmlAttributes: new { @class = "control-label col-md-2" })
Line 64:             <div class="col-md-10">
Line 65:                 @Html.EditorFor(model =>@DaysCalc(model.StartDate, model.EndDate),new { htmlAttributes = new { @class = "form-control", disabled = "disabled"} })
Line 66:                 @Html.ValidationMessageFor(model => model.noOfDays, "", new { @class = "text-danger" })
Line 67:             </div>

Source File:   Line: 65 

您只能在模型上使用具有實際屬性的For方法(即不能使用函數)。 我不確定這樣做的目的是什么,因此除非您更新問題,否則我無法真正為您提供進一步的幫助,但這至少可以解釋您的錯誤。

編輯

首先,我需要指出您的日期計算不正確。 如果StartDate為2014-06-30而EndDate為2014-07-01怎么辦。 然后,結果為1 - 30 = -29 我有理由確定這不是您要的東西。 DateTime上有一個方法專門用於此目的:

TimeSpan difference = EndDate.Subtract(StartDate);

結果是TimeSpan ,您可以將其稱為difference.Days以獲取涉及的天數。 還要注意的是, TimeSpan上有一個TotalDays屬性,該屬性將返回小數天(而Days僅返回整天)。

接下來,就其價值而言,由於您不熟悉所有這些,因此,可視化的Razor幫助程序是一個很好的新穎性,但是它們變得無用到不切實際的地步,坦白地說,它們違反了MVC(而不是Microsoft的框架)。 如果您需要進行這種類型的計算,那么最好的模型就是您的模型。 您可以實現以下屬性:

public int Days
{
    get
    {
        return EndDate.Subtract(StartDate).Days;
    }
}

但是,這是只讀的(沒有設置方法),如果您正在談論將其用作輸入值,那么擁有一個只讀屬性作為后盾是沒有意義的(除非,我猜如果將其設為只讀輸入,在這種情況下,也可能只是純文本)。 因此,如果您打算將此內容發回給您,則需要弄清楚這對二傳手而言意味着什么。 坦率地說,我看不到您會怎么做,因為唯一合乎邏輯的事情是讓它設置StartDateEndDate值,並且沒有參考點就無法做到。 您可能需要設置StartDate ,然后為Days取一個值,然后使用該值來計算EndDate ,但這全都歸結為您的業務需求。

如果要使用EditorFor,請創建一個返回您的計算值的屬性。

public class YourModel
{
    public int CalculatedDays
    {
        get
        {
            QuoteApp.Models.Quote ts = new QuoteApp.Models.Quote();
            ts.StartDate = first;
            ts.EndDate = second;

            return (ts.EndDate - ts.StartDate);
        }
    }
}

@Html.EditorFor(model => model.CalculatedDays, new { htmlAttributes = new { @class = "form-control", disabled = "disabled"} })

將Days屬性添加到視圖模型,並在其上存儲DaysCalc的結果。

然后您可以像這樣使用它:

@Html.EditorFor(model =>model.Days, new { htmlAttributes = new { @class = "form-control", disabled = "disabled"} })

嘗試在模型上創建一個屬性(假設您使用的是類型化模型,而不是動態模型):

public int Days
{
    get {

        QuoteApp.Models.Quote ts = new QuoteApp.Models.Quote();
        ts.StartDate = StartDate;
        ts.EndDate = EndDate;

        int days;
        days = (EndDate.Day - StartDate.Day);
        return days;
    }
}

用法:

@Html.EditorFor(model => model.Days, new { htmlAttributes = new { @class = "form-control", disabled = "disabled"} })

我不確定EditorFor是否可以與readonly屬性一起正常使用,但是您似乎只是將其用於顯示或其他目的?

另外,我不確定您使用Quote對象的目的是什么,因為除了創建它外,您似乎並沒有對它做任何事情,因此可以簡化為:

public int Days
{
    get {
        return EndDate.Day - StartDate.Day;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM