【问题标题】:View takes values from query string instead of modelView 从查询字符串而不是模型中获取值
【发布时间】:2014-10-06 20:37:44
【问题描述】:

我的控制器中有一个动作:

public PartialViewResult MyAction(int? myId, int? myId2)
{
    MyModel model = new MyModel() { MyId = 10, MyId2 = 20 }
    return PartialView(model);
}

这是我的看法:

@model StartSite.Models.Shared.MyModel

@using (Html.BeginForm())
{
    @Html.HiddenFor(m => m.MyId)
    @Html.HiddenFor(m => m.MyId2)

    <p>
        <input type="submit" value="Submin" />
    </p>
}

让我们使用参数 myId=1&myId2=2 调用 MyAction。但是模型是用不同的值创建的 new MyModel() { MyId = 10, MyId2 = 20 }。应该呈现什么?正如我所料,它应该是:

<input id="MyId" name="MyId" type="hidden" value="10">
<input id="MyId2" name="MyId2" type="hidden" value="20">

但实际上结果是:

<input id="MyId" name="MyId" type="hidden" value="1">
<input id="MyId2" name="MyId2" type="hidden" value="2">

我猜 Html.HiddenFor 的值不是来自我的模型,而是来自 Reauest.QueryString,即 myId=1&myId2=2呈现视图的那一刻。

为什么会这样?这是预期的行为吗?

更新 1: 我已将我的问题编辑得更清楚。

【问题讨论】:

  • myId2 来自哪里?那是复制粘贴错误,还是我们正在查看您的控制器的属性? (它免于动作签名)
  • 是的,很抱歉这个错字。现在是正确的。
  • 制作返回视图而不是返回局部视图,如果您仍然遇到此错误,请告诉我。如果没有,我可以向您解释详细信息。
  • 我试过了,没用。我认为这两种情况的 html-helper 逻辑是相同的。

标签: asp.net-mvc-4 html-helper razorengine


【解决方案1】:

在提交尝试中访问模型

   [HttpPost]
   public virtual PartialViewResult MyAction(MyModel  model)
   {
     //MyModel model = new MyModel();

     // if (myId != null)
     //    model.MyId= myId;
     // else if (myId2 != null)
     //   model.MyId2= myId2;

    //now you have access to your model values
    return PartialView(model);
 }

【讨论】:

  • 我理解 post case 的想法,但不明白为什么它在我的 get-action 案例中以这种方式工作。我在模型中定义值,但视图从查询字符串中获取它们。无论如何,感谢您指出解决问题的方法。
  • 我的意思是 ModelState,而不是查询字符串。
【解决方案2】:

这是预期的行为。首先,没有任何属性的Action 自动成为HttpGet。接下来,您的 Action 需要 'myId' 的值。这意味着,如果调用 Action 的 url 有一个匹配的查询字符串,它将接受该值。最后,Action 接受的值是不区分大小写。因此,您无需手动设置模型值。你可以这样做:

public virtual PartialViewResult MyAction(MyModel model)
{
    return PartialView(model);
}

所以当您访问您的网址时,例如localhost/myaction?myId=2model.MyId 将设置为 2。

如果您不希望通过查询字符串设置模型,则必须更改您的 Action 以不接受任何值。

【讨论】:

  • 我们先不谈后期。我的问题是关于视图中的 @Html.HiddenFor(m => m.MyId2) ,它从请求值而不是模型呈现 myId2。
  • 这就是它的工作原理。 GET 与 POST 一样是“后操作”。如果您传入具有匹配值的查询字符串,它会自动成为 GET。要解决此问题,您需要创建另一个操作。一个不接受查询字符串,一个用于您的“后操作”。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多