ASP.NET MVC:如何在发布

时间:2016-05-30 19:42:12

标签: c# asp.net-mvc razor asp.net-mvc-5

我有以下控制器:

// 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 post)中用于从db查找父标题并使用ViewBag将其传递给view,但是如果用户没有选择MaterialPaymentRequestId下拉项,则在回发后,我丢失了{{1} }}。目前我阅读MaterialPaymentRequestId变量并查看内部url以查找要查找parentID的参数。 我的网址称为http://localhost:46813/Admin/MaterialPaymentRequestSbuItem/CreateChild?parentId=23

然而,这种做法似乎是一种不好的做法,因为我不能在两个控制器方法之间传递v变量这样的过程:

控制器方法(get)--->查看--->控制器方法(帖子)

目前我觉得MVC有点卡死了!

1 个答案:

答案 0 :(得分:0)

我希望我明白你的观点,你可以在你的视图中使用@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)
{
 //
}
  //
}