【问题标题】:C# MVC: View with optional ViewModel (data not always present / necessary)C# MVC:带有可选 ViewModel 的视图(数据并不总是存在/必要)
【发布时间】:2009-06-05 21:06:52
【问题描述】:

我有点陷入 MVC 问题。

我有一个注册视图,通过 www.example.com/register 访问,如下所示:

<form id="registrationform" method="post">
<fieldset>
    <label for="emailaddress">Email</label>
    <input id="emailaddress" name="emailaddress" type="text" />
    //more inputs etc. 
</fieldset>
</form>    

现在我允许人们邀请其他人,因此我在控制器的 Register 方法中检查邀请参数 (www.example.com/register?invite=1234)。如果邀请参数不为空,我会在我的数据库中进行查找以获取关联的“受邀”用户。一切正常。

现在的问题是:我想用数据库中的数据预填充我的输入。我已经有了数据,只是不知道将其放入 MVC 视图并禁用现在已经填充的输入的最佳方法。

视图模型?请记住,我需要定期清空视图(我不想使用不同的视图,否则会违反 DRY)。

谢谢你:)

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller


    【解决方案1】:

    我建议您创建一个 ViewModel 并让您的 View 完全不知道数据是否从数据库中预填充。

    如果您正在预填充数据.. 然后用必要的数据填充您的 ViewModel(并禁用即将预填充的输入)

    如果你是从头开始......然后用空/默认数据填充你的 ViewModel

    无论哪种方式,您的视图所做的只是显示表单,并根据传入的 ViewModel 在各种文本框和其他输入中填充默认数据。

    【讨论】:

      【解决方案2】:

      在您的视图模型中:

      public class RegistrationViewModel
      {
          public bool Invited;
      
          /*
           * Fields for prepopulating inputs
           */
      }
      

      在你看来:

      <%= Html.TextBox("email", null, Model.Invited ? new { @readonly = "readonly"} : null) %>
      

      或

      <%= Html.TextBox("email", null, Model.Invited ? new { @disabled = "disabled"} : null) %>
      

      【讨论】:

      • 使用 Html.Textbox 代替直接写
      • 绝对没有。在可能的地方使用 Html.Textbox
      • Html.* 与直接标签等效的优点是什么?只是试图理解其中的原因。谢谢你:)
      • Html.Textbox("value" ...) 从 ViewData 或 ModelState 填充其值(如果 ViewData 中没有“值”)。也可以定义“默认”值(如果 ViewData 和 ModelState 都是空的)。它还最大限度地减少了呈现错误标记的可能性。
      • 如何让我的 POST /register 返回 ViewModel? (例如 Register(RegistrationViewModel registrationVM) 那么?所以我不必使用 FormCollection...
      猜你喜欢
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多