2016-05-30 16 views
1

これは私のシナリオです:MaterialPaymentRequestというモデルがあります。それはいくつかのMaterialPaymentRequestSubItemで構成されているので、PaymentRequestは親で、MaterialPaymentRequestSubItemはその子です。 私はMaterialPaymentRequestを持っていて、それに子供を追加したいときを考えてみましょう。 現在MaterialPaymentRequestSbuItemController内部その方法は次のようになります。ASP.Net MVC:HTTPostコントローラに情報を渡す

@Html.DropDownList("MaterialPaymentRequestId", String.Empty) 

:私はそれを凍結するか、読み取り専用、それをすることはできませんドロップダウンを持っているので

public ActionResult CreateChild(int parentId) 
{ 
    if (parentId==null) 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

    var parenetRequest = (from request in db.MaterialPaymentRequests 
     where request.Id==parentId 
     select request); 

    ViewBag.MaterialPaymentRequestId = new SelectList(parenetRequest, "Id", "Description", parentId); 
    ViewBag.ParentID = parentId; 
    return View(); 
} 

私の問題は、ビュー内で、ユーザーがその親を変更することができます私はViewModelを使用しようとしましたが、postの後に私のchilのparentIDを設定しましたが、この方法では、http-postコントローラメソッドにParentIdを渡す方法がわかりません。ビューモードを使用する前に

私のポストバックメソッドは、このようなものです:私はHtml.Hiddenを使用thisのようなメソッドを見てきましたが、私は、ユーザがユーザ側で情報を操作することができるので、それは十分に確保されていないと思う

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateChild([Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
    } 
    .... 
} 

もっと良い方法がありますか?

このような宣言でparentIDをパラメータとして受け入れるコントローラに情報を渡すことはできますか?私はあなたがいない場合は、セッション変数を使用して、サーバー側のPARENTIDコンテンツの状態を維持することをお勧め

@Html.DropDownList("MaterialPaymentRequestId", String.Empty, new { @readonly = "readonly" }) 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateChild(int parentID, [Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem) 
{ 
    if (ModelState.IsValid) 
    { 
     ... 
    } 
    .... 
} 

答えて

0

は以下を使用し、唯一のクライアント側で読みHTMLヘルパー入力コントロールを作成するにはクライアント側の隠しフィールドを使用したい

Session["parentId"] = parentId; 

// just an example to extract Session variable 
int parentId = Session["parentId"] != null ? Convert.ToInt32(Session["ParentId"]) : return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

あなたのビュー内の隠しフィールドが必要な場合は、その値に対して検証スキーマを隠しフィールドに(例えばBase64でまたはより良いエンコーディングを)エンコードされたテキストを使用し、そのため、あなたのサイトを訪問するすべてのユーザーが簡単に変更することはできませんクライアント側の値。

ビュー:

@Html.Hidden("ParentID", @ViewBag.ParentID); 

// or if you have a viewmodel, pass viewmodel's value here 
@Html.HiddenFor(model => model.ParentID); 

コントローラ方法:

public ActionResult CreateChild(int parentId) 
{ 
    ... 
    // convert parentId into Base64 
    ViewBag.ParentID = Convert.ToBase64String(parentId); 
    return View(ViewBag); // model binding 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateChild([Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity,ParentID")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem) 
{ 
    ... 
    // get Parent ID 
    int parentId = (int)Convert.FromBase64String(ParentID); 

    // write your own algorithm to validate hidden field's value 
    ... 
    if (ModelState.IsValid) 
    { 
      // redirect to create child elements 
      return RedirectToAction("CreateChild", "Controller", new { @id = parentId }); 
    } 
} 

希望あなたのための便利なこの説明、CMIIW。

関連する問題