View从查询字符串而不是模型中获取值

时间:2014-10-06 20:37:45

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

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

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>
}

让我们用params myId = 1&amp; 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&amp; myId2 = 2 在渲染视图的那一刻。

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

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

2 个答案:

答案 0 :(得分:0)

可以使用此

访问提交尝试中的模型
   [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);
 }

答案 1 :(得分:0)

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

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

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

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