4

我是 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>

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

4

4 回答 4

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 网格。

编辑:不幸的是,由于我的评分不够高,我不能对所提供的答案投赞成票,因为他们应得的。

于 2013-11-06T01:56:47.440 回答
2

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

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

于 2013-11-05T20:56:04.703 回答
1

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

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

如果您使用EditorForModel而不是TextBoxForModel,它将创建具有正确类型的输入,以使用内置日期选择器的浏览器(如果可用)。然后,您可以使用 Modernizr 测试是否支持日期,如果不支持,则使用 jQuery 日期选择器。 这是一个不错的教程

于 2013-11-05T20:57:48.813 回答
1

您必须注意,您在视图中使用 C# 和 razor 所做的任何事情都发生HTTP 响应之前。因此,一旦将响应发送到客户端,您的所有@Model.valueor@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 请求结束构建,所以您可以在用户看到它们时从任何包含的部分视图访问主视图的所有元素。

希望这可以帮到你!

于 2013-11-05T21:01:52.863 回答