Asp.net 如果我来自mvc中的Create,是否有一个变量通知编辑操作?

Asp.net 如果我来自mvc中的Create,是否有一个变量通知编辑操作?,asp.net,asp.net-mvc-3,razor,Asp.net,Asp.net Mvc 3,Razor,使用mvc3,如果我来自创建到编辑操作,是否有一些变量可以通知我 如果在GET中也使用了路由,则我需要某种行为,否则,如果触发了CreateAction,则我需要打开不同的上下文编辑 失败的第一个解决方案:创建额外的操作编辑,激发:当前对控制器类型“XController”的操作“编辑”请求在两个操作方法之间不明确 更重要的是,是否存在对MVC的误解?这个解决方案对任何人来说都很奇怪吗?我正面临mvc的质疑: 您可以向“编辑”操作添加一个可选参数,用于标记您是否来自“添加”操作,也可以从“编辑”

使用mvc3,如果我来自创建到编辑操作,是否有一些变量可以通知我

如果在GET中也使用了路由,则我需要某种行为,否则,如果触发了CreateAction,则我需要打开不同的上下文编辑

失败的第一个解决方案:创建额外的操作编辑,激发:当前对控制器类型“XController”的操作“编辑”请求在两个操作方法之间不明确


更重要的是,是否存在对MVC的误解?这个解决方案对任何人来说都很奇怪吗?我正面临mvc的质疑:

您可以向“编辑”操作添加一个可选参数,用于标记您是否来自“添加”操作,也可以从“编辑”中创建一个具有唯一名称的全新操作

前者看起来像:

public ActionResult Edit(int id, bool? fromCreate = false)
{
    if(fromCreate)
    {
        // do your special processing
    }
}
后者显然是:

public ActionResult Edit(int id)
{
}

public ActionResult EditNewlyCreated(int id)
{
}

如果有两个编辑方法,则它们必须具有不同的方法输入以区分它们

public ActionResult Edit(int id)
{
    return View(db.GetWidget(id));
}

public ActionResult Edit(int id, string username)
{
    ViewBag.Username = username;
    return View(db.GetWidget(id));
}
或者,只需使用可选参数将该方法转换为一个

public ActionResult Edit(int id, string username = "")
{
    ViewBag.Username = username;
    return View(db.GetWidget(id));
}

我还建议在创建视图中绘制一个方法属性,如[HttpGet]、[HttpPost]等。

如果在操作中:

@{ TempData["FromCreate"] = true; }
然后在编辑获取操作中:

public ActionResult Edit()
{
 if( TempData.ContainsKey("FromCreate") )
 {
  var fromCreate = (bool)TempData["FromCreate"];
  TempData.Remove("FromCreate");
  if( fromCreate )
  {
   //insert logic
  }
 }
}

如果您在MyView中有链接,请执行以下操作:

          @model ModelClass

          @Html.BeginForm()
          {
               if(Model.Id > 0)
               {
                   @Html.HiddenFor(m => m.Id);
               }

               ...
          }
在控制器中:

     public ActionResult Edit(int id)
     {
           var model = modelRepository.GetById(id);
           Return View("MyView", model);
     }

     [HttpPost]
     public ActionResult Edit(int id, FormCollection collection)
     {
           var model = modelRepository.GetById(id);
           TryUpdateModel(model)
           {
                modelRepository.Save(model);
           }
     }

     public ActionResult Create()
     {
           var model = new ModelClass();
           Return View("MyView", model);
     }

     [HttpPost]
     public ActionResult Create(ModelClass model)
     {
           ...
     }

在视图中,如果Model.Id>0,这意味着我们使用编辑操作进入视图,并且当表单发布时,如果在发布参数中有Id字段为Id隐藏,则将调用Editwith HttpPost,否则如果没有Id参数,则将调用创建操作

您的第一个示例将不起作用。调用Edit时您会收到一个错误,因为如果缺少username,无法区分要调用哪个重载。它调用第一个重载还是第二个重载并传递null作为值?@Justin-将这两个代码示例视为完全独立的-它们不可能同时存在。我不是说两个示例,在你的第一个例子中,我严格地引用了这两种方法。@JustinNiessner你是对的,这个例子不起作用。他应该在每个编辑操作上放置不同的方法属性。这个解决方案很棒!缺点是url的格式类似于Moo/Edit/76?fromCreate=True。是否有其他方法可以从url中隐藏此fromCreate?