繁体   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