![](/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.