2014-10-06 133 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

相關問題