2014-10-06 39 views
1

取值我有一个动作在我的控制器:查看从查询字符串,而不是模型

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

允许使用参数调用MyAction 身份识别码= 1 & myId2 = 2。但该模型是用不同的值创建的新的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在呈现视图的那一刻。

为什么会发生?它预期的行为?

UPDATE 1: 我编辑了我的问题,以便更清楚。

+0

myId2从哪里来?复制粘贴错误,或者我们正在查看控制器的属性? (免于行动签名) – 2014-10-06 20:49:31

+0

是的,对于这个错字抱歉。现在是正确的。 – Sergey 2014-10-07 07:25:48

+0

作出返回视图,而不是返回部分视图,让我知道如果你仍然面临这个错误。如果没有,我可以向你解释细节。 – 2014-10-07 09:08:09

回答

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); 
} 
+0

我编辑了我的问题,以便更清楚。 – Sergey 2014-10-07 08:36:58

+1

检查这 http://stackoverflow.com/questions/4837744/hiddenfor-not-getting-correct-value-from-view-model – 2014-10-07 14:40:48

+0

我理解后的情况的想法,但不明白为什么它的作品在我的情况下采取行动的方式。我在模型中定义了值,但视图从查询字符串中获取它们。无论如何谢谢你指出的方式来解决它。 – Sergey 2014-10-07 14:59:40

0

这是正常现象访问模型。首先,没有任何属性的Action自动为HttpGet。接下来,您的Action预计值为'myId'。这意味着,如果调用Action的URL具有匹配的查询字符串,它将接受该值。最后,您的Action接受的值是case-不敏感。因此,您不需要手动设置模型值。你可以简单地做到这一点:

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

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

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

+0

我们不要谈论事后动作。我的问题是关于视图中的@ Html.HiddenFor(m => m.MyId2),它从请求值中呈现myId2,而不是从模型中呈现。 – Sergey 2014-10-07 07:27:01

+0

我编辑了我的问题,以便更清楚。 – Sergey 2014-10-07 08:12:18

+0

这是如何工作的。与POST一样,GET也是一种“后置操作”。如果你传递一个匹配值的查询字符串,它会自动成为GET。为了解决这个问题,你需要创建另一个动作。一个不接受查询字符串,另一个用于“后期操作”。 – jzm 2014-10-08 00:39:26

相关问题