MVC4:如何从部分视图中获取插入/编辑的值

时间:2013-11-05 20:45:04

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

我是MVC的新手,我只是试图抓住我将在即将出现的项目中使用的MVC的某些方面。因此,我有一个视图,用户将输入有关培训的数据:名称,ID,位置和培训日期。我创建了将用于日期的部分视图,它包含了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 个答案:

答案 0 :(得分:2)

如果局部视图位于顶级页面的表单元素内,那么它将被回发,就好像它是原始表单的一部分一样。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

您必须要知道,您在视图中使用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>

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

希望这可以帮到你!

答案 3 :(得分:1)

解决:

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

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

我在父视图上缺少templateinfo部分。此外,我确实将文本框更改为TextBoxFor并使用:

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

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

要使隐藏字段构思工作,在父视图上使用相同局部视图的倍数,将隐藏字段和日期文本字段(在此示例中)设置为相同的id;隐藏的字段,你把h放在它前面(例如日期和日期)。然后,您需要设置一个javascript变量来获取活动元素的ID

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

此外,如果您正在使用日期选择器

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

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

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

请原谅,如果jQuery可能有点偏离,我关闭了我的开发机器并且我没有完全测试jQuery代码就输入了这个,但我认为你明白了。再次感谢所有的帮助。接下来将是一个jQuery网格。

编辑: 不幸的是,由于我的评分不够高,我无法提供所提供的答案,因为它们应该是。