【问题标题】:Is it possible to RedirectToAction passing data without using parameters in an ASP.NET MVC project?是否可以在不使用 ASP.NET MVC 项目中的参数的情况下 RedirectToAction 传递数据?
【发布时间】:2015-08-24 03:32:58
【问题描述】:

在我的 ASP.NET MVC 项目控制器中,我有一个

return RedirectToAction("CreatePerson", "Home")

此视图是一种创建人员的表单,并且运行良好。但是,我想 RedirectToAction 并使用从为系统创建用户的表单收集的数据预先填写表单。

如何在 CreatePerson 表单中传递来自 CreateUser 表单的数据?

我知道我可以使用参数,但如果大多数时候我调用 CreatePerson 视图而不需要这些参数,这真的是最好的方法吗?

任何正确方向的帮助将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您不能使用RedirectAction 发送数据。那是因为您正在执行 301 重定向,然后返回到客户端。

    所以最好使用TempData

    假设您将拥有具有以下属性的createperson 模型:

    public class CreatePersonData
    {
         public string name {get; set;}
         public string address {get; set;}
    }
    

    现在填写model并存储在TempData

    CreatePersonData person=new CreatePersonData();
    person.name="SomeName";
    person.address="SomeAddress";
    TempData["person"]=person;
    
    return RedirectToAction("CreatePerson", "Home")
    

    现在在接收时只需从tempdata 接收它并将填充的model 传递给view

    public ActionResult CreatePerson()
    {
        CreatePersonData person=new CreatePersonData()
        var loadPerson= TempData["person"];
        person = loadPerson;
        return View(person);
    }
    

    更新

    由于 @StephenMuecke 强调使用 TempData 丢失数据,您可能需要将 .Keep.Peek 与 TempData 一起使用以保留未来请求的值

    例如:

    .Peek

    //PEEK value so it is not deleted at the end of the request
    var loadPerson= TempData.Peek("person");
    

    .Keep

    //get value marking it from deletion
    var loadPerson = TempData["person"];
    //later on decide to keep it
    TempData.Keep("person");
    

    或者正如@Stephen 所说,只需传递id 并从数据库

    中选择user

    例如:

    return RedirectToAction("CreatePerson", "Home", new { ID = User.ID });
    

    现在在您的 CreatePerson ActionResult 中,只需从 db 获取它,如下所示:

    public ActionResult CreatePerson(int ID)
    {
        CreatePersonData person=new CreatePersonData();
        var user=(from u in tbl_user select u where u.ID=ID);
        person.name=user.name;
        person.address=user.address;
        return View(person);
    }
    

    更新 2

    您可以将上述两种方法结合起来,例如将数据存储在TempData 中并将IDrouteValues 一起传递,并检查TempData 是否不为空,然后回退到使用ID 方法检索数据。

    例如:

    public class CreatePersonData
    {
         public string Id{get; set;}
         public string name {get; set;}
         public string address {get; set;}
    }
    
    public ActionResult CreatePerson(int ID)
    {
        CreatePersonData person=new CreatePersonData();
        var loadPerson=(CreatePersonData)TempData.Peek("person"); //cast the object from TempData
        if(loadPerson!=null && loadPerson.Id==ID)
        { 
            person=loadPerson;
        }
        else
        {
             var user=(from u in tbl_user select u where u.ID=ID);
             person.name=user.name;
             person.address=user.address;
        }
        return View(person);
    }
    

    【讨论】:

    • 你能做到这一点 - 是的,但你应该 - 不。 TempData 只持续一次重定向,因此如果用户刷新浏览器,数据就会丢失。您还需要投射loadPerson。它是一种 GET 方法 - 用户可以从浏览器历史记录导航到它,或者只需在地址栏中输入导致它失败(TempData["person"] 不再存在或可能是完全不同的对象)。至少,将对象的 ID 作为路由参数传递,这样如果 TempData 对象不再存在或与给定 ID 不匹配,则可以从数据库中检索该对象。
    • @StephenMuecke 更新了答案..如果有任何问题请纠正我.. :)
    • 看起来更好(除非您还没有将 TempData 对象转换为所需的类型 - 但我们不知道这些类型是什么 :)。您显然可以将两者结合起来。传递ID和TempData,然后检查TempData - 如果不是null并且它的ID与参数匹配,则使用它,否则调用数据库。
    【解决方案2】:

    为此存在许多重载

    protected internal RedirectToRouteResult RedirectToAction(string actionName, object routeValues);
    

    您要做的是右键单击该方法和视图定义,您应该会看到它的许多重载

    // Summary:
        //     Redirects to the specified action using the action name and route values.
        //
        // Parameters:
        //   actionName:
        //     The name of the action.
        //
        //   routeValues:
        //     The parameters for a route.
        //
        // Returns:
        //     The redirect result object.
    

    【讨论】:

      【解决方案3】:

      1- 创建模型的对象 2-您可以使用会话将参数传递给您的其他操作, 3-然后将对象放入视图袋中,然后将其放在您的视图中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 2010-10-18
        • 2010-10-14
        • 1970-01-01
        • 2022-11-20
        • 2014-06-09
        • 1970-01-01
        相关资源
        最近更新 更多