![](/img/trans.png)
[英]ASP.NET MVC - calling Razor @helper from another @helper
[英]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;
}
}
但是,這是只讀的(沒有設置方法),如果您正在談論將其用作輸入值,那么擁有一個只讀屬性作為后盾是沒有意義的(除非,我猜如果將其設為只讀輸入,在這種情況下,也可能只是純文本)。 因此,如果您打算將此內容發回給您,則需要弄清楚這對二傳手而言意味着什么。 坦率地說,我看不到您會怎么做,因為唯一合乎邏輯的事情是讓它設置StartDate
和EndDate
值,並且沒有參考點就無法做到。 您可能需要設置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.