如何在不传递参数的情况下重定向到包含其他操作参数的操作?

时间:2011-02-24 08:07:35

标签: asp.net-mvc asp.net-mvc-3

下面,在CreateTest中,uponsuccessful,我想从CreateTest重定向到Tests。

我想做以下事情:

    public ActionResult Tests(int ID, string projectName)
    {
        TestModel model = new TestModel (ID, projectName);
        return View(model);
    }

 [HttpPost]
    public ActionResult CreateTest(TestModel model)
    {
        try
        {
            return RedirectToAction("Tests");
        }
        catch (Exception e)
        {
            ModelState.AddModelError("Error", e.Message);
            return View(model);
        }
    }

3 个答案:

答案 0 :(得分:32)

您可能需要在重定向时提供参数:

return RedirectToAction("Tests", new { 
   ID = model.ID, 
   projectName = model.ProjectName 
});

您将重定向到的网址现在看起来像这样:

/Foo/Tests?ID=123&projectName=abc

答案 1 :(得分:0)

使int可以为空:

public ActionResult Tests(int? ID, string projectName){
    //...
}

答案 2 :(得分:0)

我知道这有点老了但是......

我过去所做的是有一个" MessageArea" class暴露为我的基本控制器上的一个属性,我的所有控制器最终都继承自该属性。该属性实际上将类实例存储在TempData中。 MessageArea有一个Add()方法,它接受一个字符串消息和一个枚举类型(例如成功,错误,警告,信息)。

然后我有一个部分根据消息的类型使用适当的样式呈现MessageArea中的任何消息。

我有一个HTMLHelper扩展方法RenderMessageArea()所以在任何视图中我都可以简单地说@ Html.RenderMessageArea(),该方法和部分处理空值,如果没有消息则不输出任何内容。

由于存储在TempData中的数据仅存在1个请求,因此非常适合您希望操作重定向但目标页面上显示一条或多条消息的情况,例如:错误,未授权页面等...或者如果您添加项目但返回索引列表页面。

显然你可以实现类似的东西来传递其他数据。最后,我说这是对原始问题的解决方案比接受的答案更好。

编辑,示例:

public class MessageAreaModel {
   public MessageAreaModel() {
       Messages = new List<Message>();
   }

   public List<Message> Messages { get; private set; }

   public static void AddMessage(string text, MessageIcon icon, TempDatadictionary tempData) {
       AddMessage(new Message(icon, text), tempData);
   }

   public static void AddMessage(Message message, TempDataDictionary tempData) {
       var msgArea = GetAreaModelOrNew(tempData);
       msgArea.Messages.Add(message);
       tempData[TempDataKey] = msgArea;
   }

   private static MessageAreaModel GetAreaModelOrNew(TempDataDictionary tempData) {
       return tempData[TempDataKey] as MessageAreaModel ?? new MessageAreaModel();
   }

然后,可以使用上述类从控制器使用的UI层添加消息。

然后添加一个HtmlHelper扩展名,如下所示:

public static void RenderMessageArea(this HtmlHelper html) {
    html.RenderPartial("MessageArea", 
        (MessageAreaModel)html.ViewContext.TempData[MessageAreaModel.TempDataKey] ?? MessageAreaModel.Empty);
    html.ViewContext.TempData.Remove(MessageAreaModel.TempDataKey);
}

上面没有完全完成的代码我已经遗漏了各种各样的花里胡哨,但你得到的印象。