0

POCOクラスから継承する強い型のビューがあります。ビューが読み込まれるときに、モデルのプロパティをクエリ文字列値で初期化したい。

ビューロードでは、ViewDataを使用してコードを保存しています:

 public ActionResult Data() { 

    ViewData["QueryStringValue"] = this.Request.QueryString["Param1"]
    return View();

    }

HTMLマークアップでは、このコードを使用して、非表示の変数のモデルプロパティを初期化します。

<%:Html.HiddenFor(m=>m.Param,
Convert.ToInt32(Html.Encode(ViewData["QueryStringValue"]))) %>

m.paramはバイトタイプです。

リクエストのURLは次のようになります:http:// TestApp / Data / AddData?Param1 = One

View Saveイベントで、モデルバインディングを使用していますが、問題は、コントローラーで初期化されたparamの値が表示されないことです。常にNULLです。

私の保存イベントはコントローラーにマップされます:

[HttpPost]
public ActionResult SaveData(MyData d)
{
string paramValue = d.Param; //this always returns null

BO.Save(d); }

HTMLソースを調べたところ、非表示フィールド自体の値が空白であることがわかりました。以下のコードが機能し、見出し要素にparam値が表示されているため、これが発生している理由がわかりません

<h2> <%=Html.Encode(ViewData["QueryStringValue"]) %> </h2>

私はこれでどこが間違っているのか分かりません。

4

2 に答える 2

2

クエリ文字列の値をに渡す代わりに、ViewDataそれをのプロパティ値として設定し、それをViewModel/ Modelビューに渡す必要があると思います。

public ActionResult Data()
{
  YourViewModel objVm=new YourViewModel();
  objVm.Param=Request.QueryString["Param1"];
  return View(objVm);
}

強く型付けされたビューで、次のように使用します

@model YourViewModel 

@using(Html.BeginForm())
{
  @html.HiddenFor(@m=>m.Param);
  <input type="submit" value="Save" />
}

これで、Param値がyoutHttpPostアクションメソッドで使用できるようになります

[HttpPost]
public ActionResult Data(YourViewModel objVm)
{
  string param=objVm.Param;
  //Do whatever you want with param 
}
于 2012-05-02T22:04:41.737 に答える
0

ちょうどこの仕事をしました、問題はこの行にあります:

 <%:Html.HiddenFor(m=>m.Param,
Convert.ToInt32(Html.Encode(ViewData["QueryStringValue"]))) %>. I stated in the question that m.Param is of type byte. I figured out that issue was with casting.

私はこのコードを試しましたが、うまくいきました

<%:Html.HiddenFor(m => m.Param, (byte)Convert.ToInt16(this.Request.QueryString["Param1"].ToString()))%>
于 2012-05-02T23:22:22.760 に答える