2016-05-30 53 views
1

以下是我的場景:我有一個名爲MaterialPaymentRequest的模型。它由幾個MaterialPaymentRequestSubItem組成,因此PaymentRequest是父項,MaterialPaymentRequestSubItem是它的子項。 考慮當我有一個MaterialPaymentRequest,我想給它添加一個孩子。 目前其內部MaterialPaymentRequestSbuItemController方法是這樣的:ASP.Net MVC:將信息傳遞給HTTPost控制器

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(); 
} 

我的問題是內部視圖,用戶可以改變它的父,因爲我有我不能凍結,或使其只讀下拉:

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

我試過使用ViewModel後後我設置我chil的parentID但是這種方式我不知道如何將ParentId傳遞給http-post控制器方法。

我使用VIEWMODE前回發的方法是這樣的:

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

我見過像this方法,其使用Html.Hidden,但我認爲這是不夠安全,因爲用戶可以操縱在用戶側信息。

有沒有更好的方法來做到這一點?

我可以將信息傳遞給接受parentID作爲參數的控制器嗎?

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

回答

0

爲了只在客戶端閱讀HTML輔助輸入控制,使用以下命令:

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

我建議你保持在服務器端parentId的內容狀態Session變量,如果你不想要使用客戶端隱藏字段。

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。

相關問題