1

我的问题:如果我们已经将 view -a 设为强类型,那么为什么我们需要将模型对象从控制器 post 方法返回给 view - MVC 4 asp.net?

例如:我有计算器视图:

@using (Html.BeginForm())
{
    <p>Number One : @Html.TextBoxFor(m => m.numberOne)</p>
    <p>Number Two : @Html.TextBoxFor(m => m.numberTwo)</p>
        <input type="submit" value ="Addition" name="calculateOperation"  />
           <input type="submit" value ="Subtraction" name="calculateOperation" />
           <input type="submit" value ="Multiplication" name="calculateOperation" />
           <input type="submit" value ="Division" name="calculateOperation" />
}

@using (Html.BeginForm())
{
         <p>Output     : @Html.TextBoxFor(m => m.result)</p>

}

和控制器:

public ActionResult Calculate(Calculator model, string calculateOperation)
{


    if (calculateOperation.Equals("Addition"))
    {
        int[] array = { 1, 12, 5, 26, 7, 14, 3, 7, 2 };
        model.result = model.numberOne + model.numberTwo;
    }
    if (calculateOperation.Equals("Subtraction"))
    {
        model.result = model.numberOne - model.numberTwo;
    }
    if (calculateOperation.Equals("Multiplication"))
    {
        model.result = model.numberOne * model.numberTwo;
    }
    if (calculateOperation.Equals("Division"))
    {
        model.result = model.numberOne / model.numberTwo;
    }


    return View(model);

}

如果我不返回模型对象,我就不会得到 model.result 的值。

寻找正当理由。

4

4 回答 4

1

好吧,您不必发回模型,您可以只使用FormCollection参数,但是您必须获取值并将它们转换为您自己的正确类型。

public ActionResult Calculate(FormCollection form, string calculateOperation)
{
    // Need to check if form["numberOne"] is null or empty or do a int.TryParse()
    int numberOne = int.Parse(form["numberOne"]);
}

使用强类型模型,您可以通过asp.net mvc 中的模型绑定器免费获得它。代码看起来更干净,更容易使用。

使用模型,您还可以获得属性的力量,例如验证和脚手架。使用具有验证属性的模型来验证大多数场景更加清晰和容易。


在这种情况下,您需要将模型发送到视图只是因为视图需要它。这就是它的设计方式。如果您不将其存储在某个地方,模型或视图如何知道您已经进行了计算?当然你也可以使用 ViewBag:

ViewBag["result"] = model.numberOne + model.numberTwo;

在您看来:

<p>Output     :@Html.TextBox("result", (string)ViewBag["result"])</p>
于 2012-11-30T20:02:57.740 回答
1

HTTP 是一种无状态协议。因此,当您在服务器上工作时,如果您希望它在客户端上显示某些内容,则必须将其发送回去。MVC 强类型视图实际上只是渲染引擎之上的抽象。

当你“提交”表单时,你只是在做一个 HTTP POST 回到你的控制器操作(一个 http 请求)。

打电话

 return View(model) 

表示您正在发送返回呈现的 html 页面(使用您的视图)的 HTTP 响应。在您的情况下,您只是将模型作为参数传递。

于 2012-11-30T20:13:24.947 回答
0

您的控制器方法没有实际要求返回使用该模型或任何其他模型的任何内容。因此,您仍然需要明确说明要返回的视图以及与之关联的数据。

他们可以向 View 添加某种重载,隐含地假设它应该在方法参数中使用一些 ViewModel,但这是不直观且不必要的。

于 2012-11-30T20:11:21.240 回答
0

我一直认为这是为了涵盖有某种解释或响应类型数据的情况。

例如。您提交要添加到数据库中的地址,并且您有一个服务来检查地址的正确性。如果它是正确的,它会被持久化,否则它会被更正,添加到原始对象中的一个特殊字段中,然后发回确认。

于 2012-11-30T20:05:16.387 回答