【问题标题】:Passing model values to views MVC 5将模型值传递给视图 MVC 5
【发布时间】:2015-10-19 09:29:33
【问题描述】:

我需要如何正确地做到这一点。

  1. 我无法使用表单身份验证
  2. 用户将根据某个值“登录”或确认身份

我需要像这样引导用户浏览一系列页面

  1. 联系方式/邮件地址
  2. 联系方式/电话
  3. 联系方式/电子邮件
  4. 联系方式/总结
  5. 问卷/问题1
  6. 问卷/问题2
  7. 问卷/问题3
  8. 问卷/总结
  9. 最终/认证
  10. 最终/审查

我计划使用 Session 来保存数据,但我无法弄清楚如何将值传递给其他视图以及如何重定向到其他页面。

任何帮助都可以......

【问题讨论】:

    标签: asp.net-mvc model-view-controller model views


    【解决方案1】:

    假设你有一些这样的模型

    public class ContactModel 
    {
        public string MailAddress { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
    }
    
    public class QuestionaireModel
    {
        public string Question1Answer { get; set; }
        public string Question2Answer { get; set; }
        public string Question3Answer { get; set; }
    }
    
    public class ContactQuestionaireModel
    {
        public ContactModel Contact { get; set; }
        public QuestionaireModel Question { get; set; }
    }
    

    并且您希望从视图到视图以及从操作到操作保持此模型。在您的控制器中,您可以创建 2 个动作。一个用于您的第一个视图,一个用于您的第二个视图

    控制器

    public ActionResult ContactAddress()
    {
        var model = new ContactQuestionaireModel();
        return View(model);
    }
    
    [HttpPost]
    public ActionResult ContactAddress(ContactQuestionaireModel model)
    {
        var currentModel = TempData["currentModel"] as ContactQuestionaireModel;
        currentModel.Contact.MailAddress = model.Contact.MailAddress;
        TempData["currentModel"] = currentModel;
        return RedirectToAction("ContactPhone");
    }
    
    public ActionResult ContactPhone()
    {
        var model = TempData["currentModel"] as ContactQuestionaireModel;
        return View(model);
    }
    
    [HttpPost]
    public ActionResult ContactPhone(ContactQuestionaireModel model)
    {
        var currentModel = TempData["currentModel"] as ContactQuestionaireModel;
        currentModel.Contact.Phone = model.Contact.Phone;
        TempData["currentModel"] = currentModel;
        return RedirectToAction("ContactEmail");
    }
    

    在第一个操作ContactAddress 中,您创建一个新的空白模型并将其传递给您的视图ContactAddress。在该视图中,您可以将 TempData["currentModel"] 设置为等于您传入的模型。这将在 TempData 中保留 1 次发回服务器。你不需要在第一页上这样做,因为它无论如何都是空白的,但我这样做是为了节省时间。

    查看联系人地址

    @model WebApplication3.Models.ContactQuestionaireModel
    @{
        ViewBag.Title = "Contact Address";
        TempData["currentModel"] = Model; //this will be available to me in the HttpPost action
    }
    
    @using (Html.BeginForm())
    {
        <div class="form-group">
            @Html.LabelFor(m => m.Contact.MailAddress, new { @class = "col-md-2 control-label" })
            <div class="col-md-10">
                @Html.TextBoxFor(m => m.Contact.MailAddress, new { @class = "form-control" })
            </div>
        </div>
        <button type="submit">Submit</button>
    }
    

    您会在控制器代码中注意到 ContactAddress 的 Post Action 设置的 var currentModel 等于在 ContactAddress 视图中设置的 TempData["currentModel"] 中的值。在您重定向到下一个操作之前,ContactPhone 将 TempData["currentModel"] 设置回您正在构建的模型并在下一个操作中使用它。

    您确实可以选择将模型作为参数添加到每个操作并传递 currentModel 对象,如

    public ActionResult ContactPhone(ContactQuestionaireModel model)
    return RedirectToAction("ContactPhone", currentModel);
    

    这真的取决于你。这不是万无一失的方法。页面刷新和后退和前进按钮可以清除输入的所有内容。将信息存储在Session 中或将数据实际保存在数据库中可能更理想。

    【讨论】:

    • 这很好用...但是我如何处理模型的部分验证...如果在 Contact/MailAddress 上填写了邮件地址但需要电话,您如何处理?跨度>
    • 您可以随时验证服务器端并将模型错误传递回视图(如果需要)。如果有效,则只有一个 if 语句和 return RedirectToAction,如果无效,则只返回 View(model)。
    【解决方案2】:

    我建议不要通过 session 登录来做你想做的事情,但你正在寻找的是:

    TempData.yourModel = new SomeModel { Data = "yourData" };
    
    //next page
    var model = (SomeModel)TempData.yourModel;
    

    和

    RedirectToAction("yourController", "yourAction");
    

    【讨论】:

    • 在使用redirecttoaction函数时,模型如何维护???还是我将模型存储在 viewbag 中
    • 要么将模型存储在 ViewBag 中,然后在下一页中将其投射回原处,要么执行此操作以在 url 上附加数据:return RedirectToAction("yourController","yourAction", new { FirstName="约翰", LastName="Doe"});
    • 如果您使用 RedirectToAction 将数据发送到另一个操作,则需要使用 TempData
    • ViewBag 在重定向后将为空
    • 我应该用模型作为参数来做一个动作吗?
    猜你喜欢
    • 2015-01-28
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多