[英]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.