簡體   English   中英

ASP.NET MVC:如何在發布前后的控制器之間傳遞參數

[英]ASP.NET MVC: How to pass parameter between controllers before and after post

我有以下控制器:

// GET: /MaterialPaymentRequestSbuItem/CreateChild
public ActionResult CreateChild(int? parentId)
{
    if (parentId==null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

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

    ViewBag.MaterialPaymentRequestId = new SelectList(parenetRequest, "Id", "Description", (int)parentId);
    ViewBag.ParentID = parentId;
    if (parenetRequest!=null && parenetRequest.First()!=null)
        ViewBag.ParentTitle = parenetRequest.First().Description;

    return View();
}

// POST: /MaterialPaymentRequestSbuItem/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateChild([Bind(Include = "Id,Name,Unit,UnitPrice,MaterialPaymentRequestId,Quantity")] MaterialPaymentRequestSubItem materialpaymentrequestsubitem)
{
    if (ModelState.IsValid)
    {
        try
        {
            db.MaterialPaymentRequestSubItems.Add(materialpaymentrequestsubitem);
            db.SaveChanges();
        }
        catch (Exception e)
        {
            return new HttpStatusCodeResult(HttpStatusCode.InternalServerError);
        }
        updateTotalPriceOfParentPaymentRequest(db, db.MaterialPaymentRequests.Find(materialpaymentrequestsubitem.MaterialPaymentRequestId));
        return RedirectToAction("List", new { id = materialpaymentrequestsubitem.MaterialPaymentRequestId });
    }

    ViewBag.MaterialPaymentRequestId = new SelectList(db.PaymentRequests, "Id", "Description", materialpaymentrequestsubitem.MaterialPaymentRequestId);
    //need to becheked
    ViewBag.ParentID = materialpaymentrequestsubitem.MaterialPaymentRequestId;
    if (Request != null && Request["parentID"] != null)
    {
        try
        {
            int id = Int32.Parse(Request["parentID"]);
            ViewBag.ParentTitle = db.MaterialPaymentRequests.Find(id).Description;
        }
        catch(Exception e)
        {

        }
    }
    return View(materialpaymentrequestsubitem);
}

我的主要問題是允許用戶從下拉列表中選擇model.MaterialPaymentRequestId,而他/她可能沒有選擇任何值。 MaterialPaymentRequestId在第一控制器(befor后)用於找到分貝父稱號,並通過它使用ViewBag查看,但是如果用戶沒有選擇MaterialPaymentRequestId下拉菜單項,回傳后,我失去了MaterialPaymentRequestId 目前,我閱讀了Request變量,並在url中查找了用於查找parentID的參數。 我的網址調用類似於http:// localhost:46813 / Admin / MaterialPaymentRequestSbuItem / CreateChild?parentId = 23

但是,這種做法似乎是一種不好的做法,因為我無法在兩個控制器方法之間傳遞v變量,如下所示:

控制器方法(獲取)->視圖->控制器方法(發布)

目前,我對MVC感到有些困惑!

我希望我的觀點正確,您可以在視圖中使用@Html.hiddenfor(model => model.ParentId) ,它將存儲查詢字符串中的ParentId值,並且當用戶提交表單時,它將被張貼到POST方法中,因此您不需要調查網址以獲取它。 使用帶有ParentId屬性的viewmodel並執行以下操作

public class MaterialPaymentsViewModel {
    //other properties
    public int ParentId {get;set;}
}

public ActionResult CreateChild(int? parentId)
{
    var model = new MaterialPaymentsViewModel{ParentId = parentId};
    //other stuff

    return View(model);
}

//View

@using (Html.beginform()){
//
@html.hiddenfor(m => m.ParentId)
//submit
}


[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateChild(MaterialPaymentsViewModel  model)
{
    if(model.ParentId != null)
{
 //
}
  //
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM