繁体   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