【问题标题】:MVC4: How do I get value from partial view for insert/editMVC4:如何从局部视图中获取值以进行插入/编辑
【发布时间】:2013-11-16 21:28:44
【问题描述】:

我是 MVC 的新手,我只是想掌握 MVC 的某些方面,我将在即将开始的项目中使用这些方面。因此,我有一个视图,用户将在其中输入有关培训的数据:姓名、身份证、位置和培训日期。我创建了将用于日期的部分视图,它包含 jQuery 日期选择器和日期掩码。此 pv 将在需要时替换日期字段。一切正常,但是,一旦用户单击“创建”或“编辑”按钮,我不知道如何将放置在局部视图中的值传递回模型。

这是我的代码(编辑视图):

@Html.Partial("partialview", Model.ValueToPass)

对于局部视图:

@model Nullable<DateTime>
@{ 
string dt = string.Empty;
if (Model != null) { dt = Model.Value.tostring("MM/dd/yyyy"); }
<script type="text/javascript">.......</script>
<p> @Html.TextBox("Test", dt, new {@class = "DateTextArea"}) </p>

如上所述,我可以从加载到文本框中的模型中获取预先存在的日期,没有问题,如果用户输入新日期并将其放入数据库,它只是检索该值或新值。任何帮助或方向都会有很大帮助。谢谢。

【问题讨论】:

    标签: c# jquery asp.net-mvc asp.net-mvc-4 partial-views


    【解决方案1】:

    如果部分视图位于顶层页面的表单元素中,则它将被回发,就好像它是原始表单的一部分一样。

    将局部视图视为仅在渲染时使用。当您在浏览器中看到该页面时,将其视为一个完整的页面(而不是部分视图组)。因此,任何页面提交都将在考虑整个表单的情况下完成。

    【讨论】:

      【解决方案2】:

      已解决:

      我要感谢你们每一个人的意见,因为他们确实帮助我找到了解决方案。我缺少的主要部分是:

      @Html.Partial("partialview"), Model.ValueToSend, new ViewDataDictionary(ViewData) {
      TemplateInfo = new System.Web.Mvc.TemplateInfo {HtmlFieldPrefix = "ValueToSend"
      })
      

      我缺少父视图上的模板信息部分。另外,我确实将我的文本框更改为 TextBoxFor 并使用:

      TextBoxFor(model => model, new { @class = .....)
      

      不要使用 model.Value,因为我之前有过,并且在回发时仍在检索空日期值。解决方案代码不需要填充隐藏字段,templateinfo 代码在局部视图的输入字段中添加了一个 id,并且父控制器自动抓取局部输入字段中的数据以发送到数据库,就好像它是父视图上其他自动生成的元素之一。

      为了使隐藏字段的想法起作用,在父视图上具有多个相同的局部视图,将隐藏字段和日期文本字段(在本例中)设置为相同的 id;您在其前面放置 h 的隐藏字段(例如 date 和 hdate)。然后你需要设置一个 javascript 变量来获取活动元素的 id

      var id;
      ($(".datepickerclass").change(function(){
      id = $(this).attr('id');
      )}
      

      另外,如果您使用的是日期选择器

      $(".datepickerclass").datepicker(
      .....
      beforeShow:
      id = $(this).attr('id')
      

      然后将值添加到文本框的更改或模糊事件或日期选择器中的正确隐藏元素:

      onSelect: 
      var val = $(id).val()
      $('#h'+ id).val(val)
      

      请原谅,如果 jQuery 可能有点不对劲,我关闭了我的开发机器,我在没有完全测试 jQuery 代码的情况下输入了这个,但我想你会明白的。再次感谢所有帮助。接下来将处理一个 jQuery 网格。

      编辑: 不幸的是,由于我的评分不够高,因此我无法对提供的答案进行投票,因为它们应得的。

      【讨论】:

      • 尽管我不是特别喜欢人们发布自己的问题的答案,但您似乎至少了解这里发生的事情。如果您对 javascript 和动态内容感兴趣,我建议您研究的一件事是:knockout.js 这是一个客户端的 javascript MVVM 框架,可以轻松让您完成 mvc 无法处理的事情就像创建或修改 IEnumerable。您必须使用一些技巧(从 json 到 POCO/实体的自动反序列化),但是一旦掌握了窍门,那就太好了。
      • 感谢您提供的信息。我认为这对于使用网格是必要的。我发布答案的唯一原因是这个问题的链接不够多,我认为以这种方式使用部分视图会相当受欢迎。我只是想确保如果其他人发生在这个线程上,他们会得到他们需要的解决方案。此外,应该创建一个扩展方法来解释传递给局部视图的空值。使用日期和更简单的数据类型,pv 中的基本字符串模型将起作用,然后根据需要操作该字符串。
      【解决方案3】:

      使用@Html.TextBoxForModel 而不是@Html.TextBox(....)。这将导致使用正确的名称创建输入,以便在您发布页面时它将正确绑定到您的模型。

      您不需要自己格式化日期,您可以使用 jQuery 日期选择器上的 dateFormat 选项来格式化值。

      如果您使用EditorForModel 而不是TextBoxForModel,它将创建具有正确类型的输入,以使用浏览器内置的日期选择器(如果可用)。然后,您可以使用 Modernizr 测试是否支持日期,如果不支持,则使用 jQuery 日期选择器。 Here is a decent tutorial about it.

      【讨论】:

      • 我添加日期格式的唯一原因是因为还有一个与该字段相关的屏蔽插件;加载到该字段中的数据也可能不是正确的格式,它必须有“0”占位符才能正常工作(实际上,并非如此,我只是一个坚持一致性的人)。另外,'TextBoxForModel' 应该是 TextBoxFor(Model, ....),因为我在里面找不到那个助手。
      • 您在TextBoxFor(Model 上是正确的。有EditorForModelDisplayForModel,所以我假设有TextBoxForModel
      【解决方案4】:

      您必须注意,您在视图中使用 C# 和 razor 所做的任何事情都发生在 HTTP 响应之前。因此,一旦响应发送到客户端,您的所有 @Model.value@if(something) { @Html.Partial(...) } 语句都将已经翻译成纯 HTML。

      从局部视图获取值到主视图的方法是使用 jQuery:

      想象一个像这样的主视图:

       @Html.HiddenFor(m=>m.ChosenName, new { id="hiddenGlobalName" }
      

      还有这样的局部视图:

      <input type="text" id="partialNameField" />
      <input type="button" value="Save and close popup" id="closeButton" />
      <script>
          $(function(){
              $('#closeButton').click(function(){
                  var partialValue = $('#partialNameField').val();  // get the value
                  $('#hiddenGlobalName').val(partialValue);         // "save" to main view
              });
          });
      </script>
      

      由于 DOM 将在 HTTP 请求结束后构建,因此您可以在用户看到它们时从任何包含的局部视图访问主视图的所有元素。

      希望对你有帮助!

      【讨论】:

      • 这是一个帮助,我想我必须使用隐藏字段,但我想知道是否有任何更精简的东西,因为这意味着更多的元素等。出现了问题当单个父视图上有多个此部分视图时,如果我设置日期文本框的 id,页面上将有多个,并且 jQuery 将适合。我认为我不能将 Model."ValueToPass" 作为 id 传递给元素。我怎么能绕过这个,或者 JQuery 不会是一个问题?
      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多