所以我正在考虑从MVC 1.0转向MVC 2.0 RTM.我想开始遵循的一个约定是使用强类型HTML帮助程序来生成像文本框这样的控件.
但是,看起来它不会是一个简单的跳跃.我尝试迁移我的第一个表单,替换这样的行:
<%= Html.TextBox("FirstName", Model.Data.FirstName, new {maxlength = 30}) %>
Run Code Online (Sandbox Code Playgroud)
...对于这样的行:
<%= Html.TextBoxFor(x => x.Data.FirstName, new {maxlength = 30}) %>
Run Code Online (Sandbox Code Playgroud)
以前,这将使用以下方法签名映射到POST上的相应视图模型:
[HttpPost]
public ActionResult Registration(AccountViewInfo viewInfo)
Run Code Online (Sandbox Code Playgroud)
相反,它当前返回一个空对象.我认为断开连接是因为我们将视图模型传递给一个更大的聚合对象,该对象具有一些页面元数据和其他有趣的东西(因此x.Data.FirstName而不是x.FirstName).
所以我的问题是:使用强类型帮助器的最佳方法是什么,同时仍允许MVC框架将表单集合适当地转换为我的视图模型,就像在原始行中一样?有没有办法在不更改我们传递给视图的聚合类型的情况下执行此操作?
谢谢!
更新:所以绑定属性运行良好,但我不喜欢我必须将其应用于基本上每个发布的视图模型.我最终更改了继承层次结构,以便所有视图模型都从包含页面内容和其他元数据的基类继承,而不是作为名为的聚合属性Data.
c# attributes model-binding asp.net-mvc-2-validation asp.net-mvc-2
也许我在这里遗漏了一些东西,但是当使用TryUpdateModel时,似乎忽略了对象模型树3或更多级别的任何内容.
例如(简化):
public virtual ActionResult SomeAction(int id, FormCollection form)
{
IValueProvider vpFrom = form.ToValueProvider();
/*
At this stage, vpForm contains:
1)PropertyA
2) PropertyB.SubPropertyA
3) PropertyB.SubPropertyB.SubSubPropertyA
*/
TryUpdateModel(someObjectModel, null, null, null, vpFrom);
//The first two properties are applied, number (3) seems to be ignored
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?如果这是它的方式,有没有人想出一个解决方法?
根据这篇文章,我试图绑定一个非顺序项列表.
视图:
<%using (Html.BeginForm("Products", "Home", FormMethod.Post))
{ %>
<input type="hidden" name="products.Index" value="cold" />
<input type="text" name="products[cold].Name" value="Beer" />
<input type="text" name="products[cold].Price" value="7.32" />
<input type="hidden" name="products.Index" value="123" />
<input type="text" name="products[123].Name" value="Chips" />
<input type="text" name="products[123].Price" value="2.23" />
<input type="hidden" name="products.Index" value="caliente" />
<input type="text" name="products[caliente].Name" value="Salsa" />
<input type="text" name="products[caliente].Price" value="1.23" />
<input type="submit" value="Submit" />
<%} %>
Run Code Online (Sandbox Code Playgroud)
行动方式:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Products(IList<Product> products)
{
return View("Index");
}
Run Code Online (Sandbox Code Playgroud)
绑定似乎对我不起作用,参数产品总是包含null.我错过了什么吗?
任何帮助非常感谢,谢谢.
请注意,我使用的是ASP.NET MVC 1.0
WebApi和EF POCO可以很好地合作。我一直在思考的一个问题是,随着时间的流逝,某些对象实际上可能变得非常大。它们可以具有许多映射回数据库中列的属性。有了这些对象,很少会一次更新多个或两个以上的字段,因此引出了一个问题:为什么要求所有字段都执行从客户端到服务器再到数据库的完整行程。
一些JavaScript框架提供了有关是否将所有字段发送或仅将更改后的字段发送回服务器的选项,因此客户端是简洁明了的。
从我所看到的来看,服务器端还有些挑战。序列化器将介入并尝试将一些json或xml映射到类型。例如,如果对象中的相应属性可为空,则JSON.NET可以很好地处理缺失值。
另一方面,将反序列化的模型重新附加到实体框架是一件棘手的事情。控制器的默认WebApi模板可以一行完成:
db.Entry(user).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)
显然,这会将整个对象设置为修改。当然,可以将单个属性设置为修改后的属性,而不是整个对象,并且我认为这意味着EF更加聪明,只将修改后的属性发送回SQL UPDATE。
因此,这里的问题是,我如何知道更新了哪些属性?我仅在控制器方法中获得了一个对象,因此我无法询问序列化程序引入了哪些属性(即使对于给定的序列化程序而言这是可能的)。如果我有属性列表,则可以在EF中设置当前值及其状态以进行修改,并希望这会导致我的数据库查询干净。
另一个可能更明显的选择是,首先从数据库中检索要更新的对象,然后仅对检索到的对象逐个修改已更改的属性,或者如果EF支持,则可以将其传递给未附加的对象,然后让它自己做。这不是一个理想的选择,因为它的确意味着要读取整个数据库,而整个练习的重点是效率。我们要做的是交易客户端的HTTP效率和带宽,以达到服务器到数据库的效率。
因此,对我来说,如果我想在服务器上执行此操作,那我将陷入困境。WebApi和EF完成了大部分工作,但以灵活性为代价。我正在寻找我没有提到的选项或角度,以期希望一个简单的解决方案不会丢掉这两种伟大技术中的一种。
我的问题是创建一个角度指令.
我想用一个单一的ng模型创建一组复选框.它就像一个位域或标志,即复选框的值从0,1,2,3到n,但对于ng-model,我只想添加所有选中复选框的2 ^值.要添加的值是1,2,4,8,16 ......
我想知道我的问题是否有更好,更正确或更简单的解决方案.
http://plnkr.co/edit/9h7EkEpDohXTniIDHdc5
在示例中,您可以更改文本框中的值,并且将更新检查,但不会更新.这有点疯狂,代码正在我的开发机器上工作,但不在Plnkr!
app.directive('ngCheckboxFlags', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attrs, ctrls) {
var flagSum;
var checkboxes = [];
// trigger changes of the ngModel
scope.$watch(attrs.ngModel, function (value) {
flagSum = value;
for (var i = 0, ii = checkboxes.length; i < ii; ++i) {
var checkbox = checkboxes[i];
checkbox.checked = flagSum & (1<<checkbox.value);
}
});
for (var i = 0, inputs = element.find('input[type=checkbox]'), ii = inputs.length; i < …Run Code Online (Sandbox Code Playgroud) 我有一个控制器的动作:
public ActionResult Find(IEnumerable<string> ids) { ... }
Run Code Online (Sandbox Code Playgroud)
我成功地通过路线调用它../Find?ids=01&ids=02&ids=03.DefaultModelBinder轻松绑定参数,无需额外配置.但是,当我尝试进行出站路由时,即在我的视图中使用这样的代码
@Url.Action("Find", "Grid", new {ids=new List<string>{01,02,03}})
Run Code Online (Sandbox Code Playgroud)
.. ..?ids=System.Collections.Generic.List1[System.String]我的URL中有一个很好的查询字符串.我已经找到了一些建议编写自定义绑定/路由的答案,但我相信这样一个简单的任务应该更容易解决而无需任何额外的代码.
PS:我非常乐意改变我的查询字符串格式,我只想依靠一些默认的框架行为来完成任务:在querystring中传递一个数组.
简短版本:使用查询字符串中的数组呈现控制器操作链接的最简单方法是什么?
我正在研究一个小的虚拟应用程序,以便了解WebForms中新的(非常棒的)模型绑定.我已成功地在ListView和FormView中列出数据,但是我仍然坚持更新数据.
我有一个非常简单的FormView控件:
<asp:FormView runat="server" ID="formViewOrderDetail"
ItemType="ModelBindingDummy.Models.Order" DataKeyNames="Id"
SelectMethod="GetOrder" UpdateMethod="UpdateOrder">
<ItemTemplate>
<p>Supplier Order Number: <%#: Item.SupplierOrderNumber %></p>
<asp:LinkButton Text="Edit" runat="server" ID="linkEdit"
CommandName="Edit" />
</ItemTemplate>
<EditItemTemplate>
<p>Supplier Order Number:
<asp:TextBox runat="server" ID="SupplierOrderNumber"
Text='<%#: Item.SupplierOrderNumber %>' />
</p>
<asp:LinkButton Text="Cancel" runat="server" CommandName="Cancel" />
<asp:LinkButton Text="Save" runat="server" CommandName="Update" />
</EditItemTemplate>
</asp:FormView>
Run Code Online (Sandbox Code Playgroud)
我的UpdateOrder方法看起来像这样:
public void UpdateOrder(int id)
{
ModelBindingDummy.Models.Order item = GetOrder(id);
if (item == null)
{
ModelState.AddModelError("", String.Format("Item with id {0} was not found", id));
return;
}
TryUpdateModel(item);
//All data in the …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用2个kendo日期选择器:
<div class="span12">
<div class="span2" style="text-align: right">
Start Date:
</div>
<div class="span2">
@(Html.Kendo().DatePickerFor(m=>m.StartDate))
</div>
<div class="span2" style="text-align: right">
End Date:
</div>
<div class="span2">
@(Html.Kendo().DatePickerFor(m=>m.EndDate))
</div>
<div class="span4">
<button class="btn btn-primary" onclick="getGraphData()">Show</button>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
单击该按钮时,我会读取这些日期选择器客户端的值,并向API控制器发出POST.
我遇到的问题有时是DateTime参数被错误地解析,我使用的是en-GB文化(在我的web.config中指定),但是给定日期为2014年3月1日(3月1日),当值为由模型装订器处理,它被解释为03/01/2014(1月3日).
我的javascript如下:
function getGraphData() {
var startDatePicker = $("#StartDate").data("kendoDatePicker");
var endDatePicker = $("#EndDate").data("kendoDatePicker");
var param = {
StartDate: kendo.toString(startDatePicker.value().toLocaleDateString(), "dd/MM/yyyy"),
EndDate: kendo.toString(endDatePicker.value().toLocaleDateString(), "dd/MM/yyyy")
};
// Do post here
}
Run Code Online (Sandbox Code Playgroud)
我的模型如下:
public class DateRangeParam
{
#region Constructors and Destructors
/// <summary>
/// Initializes a new instance of …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc model-binding custom-model-binder kendo-datepicker
我有这堂课
[Serializable]
public class MyObject {
// properties omitted
}
Run Code Online (Sandbox Code Playgroud)
以及此WebAPI控制器方法:
[HttpPost]
[ResponseType(typeof(string))]
public IHttpActionResult SetMyObject(MyObject o) {
// process object
}
Run Code Online (Sandbox Code Playgroud)
但是它无法建模绑定到MyObject类。控制器方法中的对象o完全为空,每个属性均为默认值(因此通常为null)。
事实证明,这是由于MyObject上的[Serializable]注释所致。删除后,模型绑定将再次起作用。
有没有办法保持[可序列化]并修复模型绑定?
我正在尝试在asp.net mvc 6中进行后期操作,并期望正确初始化复杂的属性集合.但它总是空的.
我正在创建具有适当索引的输入html元素:
这是POST的HTML表单:
@model MainObject
<form asp-action="create" method="post">
<input asp-for="ChildObjects[0].RollNumber" />
<input type="submit" value="create" />
</form>
Run Code Online (Sandbox Code Playgroud)
控制器代码
public async Task<IActionResult> Create(MainObject mainObj)
{
// The mainObj.ChildObjects remains empty.
}
Run Code Online (Sandbox Code Playgroud)
我的视图将只包含一个子对象条目,这就是为什么只使用0索引.
表单数据包含上面的键和值,但是当它到达控制器操作时,collection属性为空,即MainObject.ChildObjects的计数为0.(注意:ChildObjects列表已在我的MainObject构造函数中初始化)
楷模:
public class MainObject {
public MainObject() {
this.ChildObjects = new List<ChildObjects>();
}
public IList<ChildObject> ChildObjects {get; private set;}
}
Run Code Online (Sandbox Code Playgroud)
在调试模式下在构造函数中查找ModelState属性时,它显示ChildObjects键的一个错误,但错误消息过于通用:
对象引用未设置为对象的实例.
我已经在网上关注了很多关于模型绑定复杂集合的文章,但不知何故它对我不起作用.
model-binding ×10
c# ×6
asp.net-mvc ×5
.net ×1
angularjs ×1
asp.net ×1
asp.net-core ×1
attributes ×1
checkbox ×1
query-string ×1
routing ×1
webforms ×1