调用Razor ASP中的方法.净MVC

本文关键字:方法 MVC Razor ASP 调用 | 更新日期: 2023-09-27 18:11:33

我是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请求执行过程中出现未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源位置的更多信息。

Exception Details: 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 

调用Razor ASP中的方法.净MVC

如果您想使用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"} })

您只能在模型上使用具有实际属性的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(模式,而不是微软的框架)。如果您需要进行这种类型的计算,最好在您的模型中进行。您可以实现如下属性:

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

然而,那是只读的(没有setter方法),如果你谈论的是将它用作输入值,那么使用只读属性支持它是没有意义的(除非,我猜,如果你使它成为只读输入,在这种情况下,它可能只是纯文本)。如果这个是你打算寄回给的你需要弄清楚这在setter中是什么意思。老实说,我看不出你会用它做什么,因为唯一合乎逻辑的事情就是让它为StartDateEndDate设置值,如果没有一些参考点,你就不能这样做。您可以要求设置StartDate,然后获取Days的值,然后使用该值来计算EndDate,但这一切都归结为您的业务需求。

将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将工作相当正确与只读属性或不,但它看起来像你只是用它来显示或其他目的?

另外,我不确定你使用Quote对象是为了什么,因为除了创建它之外,你似乎没有对它做任何事情,所以这可以简化为:

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