我有一个具有此属性的模型:
[AllowHtml]
[DisplayName("Widget for Table")]
[StringLength(1000, ErrorMessage = "Maximum chars 1000")]
[DataType(DataType.Html)]
public object TableWidget { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是控制器中的create方法:
//
// GET: /Admin/Table/Create
public ActionResult Create(int id)
{
Season season = _seasonRepository.GetSeason(id);
var table = new Table
{
SeasonId = season.SeasonId
};
return View(table);
}
//
// POST: /Admin/Table/Create
[HttpPost]
public ActionResult Create(Table a)
{
if (ModelState.IsValid)
{
_tableRepository.Add(a);
_tableRepository.Save();
return RedirectToAction("Details", "Season", new { id = a.SeasonId });
}
return View();
}
Run Code Online (Sandbox Code Playgroud)
最后这是我的观点:
@model Stridh.Data.Models.Table
@using (Html.BeginForm())
{ …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的ASP.NET MVC4页面.它正在呈现CustomerModel的编辑表单.表单正确显示,但是当我点击编辑并回发时,模型没有被绑定.相反,CustomerModel的所有属性都保留其默认值.需要注意的是正确的控制器方法是被调用,所以这不是问题.
我可以看到表单值与模型属性(Id,Name,Description)匹配的名称,但模型没有设置它们.
想法?
这是模型:
public class CustomerModel
{
[Required]
public Guid Id;
[Required]
public string Name;
[Required]
public string Description;
}
Run Code Online (Sandbox Code Playgroud)
这是相关的控制器方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(CustomerModel customerModel)
{
if (ModelState.IsValid)
{
//...Do stuff
return RedirectToAction("Index");
}
return View(customerModel);
}
Run Code Online (Sandbox Code Playgroud)
最后,这是一个带有填充值的表单集合的屏幕截图:

我有一些文件在Request.Files对象中具有相同的键,当我使用此代码Request.Files.Keys ["keyName"]时,它只返回一个文件,但我有多个文件与该键.我该怎么办?!顺便说一句,我不能使用键名作为参数,因为我不知道究竟是什么键,也许模型绑定器可以帮助在这种情况下,但我不知道如何将它用于文件.谢谢
我今年是ASP.net MVC的新手.
问题 如何实现可接受多次插入数据库的方法/模型类/视图?
我知道我将不得不使用模型绑定技术,但我不确定如何在我的项目中实现它.
建议的答案 一个解决方案是一个使用多个插入实现视图的简单示例/模板.(控制器,型号,视图代码示例)
Sceanrio示例:我有一个产品表,我想插入/创建11种产品类型.因此,在我的方法/视图中插入11次产品表.
我一直在研究探索可能的解决方案,使用:
https://stackoverflow.com/search?q=model+binding+to+a+collection
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
这些是有用的,但对我的问题没有帮助.
如果有人可以就此问题向我提出建议,我将非常感激.感谢您的时间
在我的控制器中我有:
[AcceptVerbs("GET", "POST")]
public List<BuzzMonitor.Web.Message> Search(string text, DateTime dateFrom, DateTime dateTo, List<int> themeIds, List<int> sourceIds)
{...}
Run Code Online (Sandbox Code Playgroud)
我想做模型绑定.原始类型很容易,但是当我有一个原始类型列表时该怎么办?
我在Global.asax中这样做了:
GlobalConfiguration.Configuration.Routes.MapHttpRoute("SearchWithParameters", "api/{controller}/{action}/{text}/{dateFrom}/{dateTo}/?/?"
Run Code Online (Sandbox Code Playgroud)
但我不知道要为列表设置什么...
我在某个网站上发现我可以在列表之前添加[ModelBinder],但是当我这样做时,我只是在该单词上显示红色下划线.
有谁知道怎么做?
假设我有一条类似的路线:
Route::get('users/{user}/posts/{post}', 'PostController@show')
App\User我已经为to{user}和App\Postto设置了路由模型绑定{post}。我已经看到我能够调用任何给定用户的任何现有帖子来获取屏幕上的内容。是否有一个通用的地方可以将约束分配给绑定模型?
我尝试在 Action 中绑定这样的对象
public class MonthDataViewModel
{
public int Year { get; set; }
public int Month { get; set; }
public IEnumerable<MoneyDataItemViewModel> MoneyCosts { get; set; }
}
public class MoneyDataItemViewModel
{
public string Title { get; set; }
public decimal Cost { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
那可能吗?我该如何设计表格?我尝试了几次,但该属性MoneyCosts不会被绑定,这是我提交的数据:
Year=2016
Moneh=8
MoneyCosts.Title=ABC
MoneyCosts.Cost=100
MoneyCosts.Title=DEF
MoneyCosts.Cost=200
Run Code Online (Sandbox Code Playgroud)
我看到一个名为 的 modelbinder ArrayModelBinder<T>,我该如何使用它?
根据关于ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries的开创性 Scott Hanselman 文章:
我们通过查找来读入属性 索引必须从零开始并且不间断
parameterName[index].PropertyName
所以这个 HTML:
<input type="text" name="People[0].FirstName" value="George" />
<input type="text" name="People[1].FirstName" value="Abraham" />
<input type="text" name="People[2].FirstName" value="Thomas" />
Run Code Online (Sandbox Code Playgroud)
它将像这样发布:

但是,如果我通过 AJAX 将一个新人加载到我的模型中,我会丢失将该人构建到模型中的上下文并获得以下输出:
<input type="text" name="FirstName" value="New" />
Run Code Online (Sandbox Code Playgroud)

这不会被模型活页夹拾取。
问:通过 AJAX 动态添加新元素时,如何保留表达式树?
模型: /Model/Person.cs
public class PersonViewModel
{
public List<Person> People { get; set; }
}
public class Person
{
public String FirstName { get; set; …Run Code Online (Sandbox Code Playgroud) 我正在尝试为模型的 DateTime 类型属性应用自定义模型绑定器。这是 IModelBinder 和 IModelBinderProvider 的实现。
public class DateTimeModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (context.Metadata.ModelType == typeof(DateTime))
{
return new BinderTypeModelBinder(typeof(DateTime));
}
return null;
}
}
public class DateTimeModelBinder : IModelBinder
{
private string[] _formats = new string[] { "yyyyMMdd", "yyyy-MM-dd", "yyyy/MM/dd"
, "yyyyMMddHHmm", "yyyy-MM-dd HH:mm", "yyyy/MM/dd HH:mm"
, "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss"};
private readonly IModelBinder baseBinder;
public DateTimeModelBinder()
{
baseBinder = new SimpleTypeModelBinder(typeof(DateTime), null); …Run Code Online (Sandbox Code Playgroud) 我基本上有一个表单,在其中添加和删除项目并使用模型绑定将它们绑定到列表。这对于修改字段和添加新项目效果很好,但是当我尝试删除它们时,我破坏了索引,并且绑定的列表不包含所有项目。
我生成的标记看起来像这样:
<table>
<tbody>
<tr>
<input type="text" name="devices[0].id" value="8574" />
<input type="text" name="devices[0].type" value="Type1" />
</tr>
<tr>
<input type="text" name="devices[1].id" value="4385" />
<input type="text" name="devices[1].type" value="Type2" />
</tr>
<tr>
<input type="text" name="devices[2].id" value="9486" />
<input type="text" name="devices[2].type" value="Type1" />
</tr>
...
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
我的模型绑定如下:
public IActionResult OnPostSave(List<Device> devices){
// ... do something
}
Run Code Online (Sandbox Code Playgroud)
现在,我让用户通过 javascript 简单地从表中删除行,然后将更新后的表单发送到我的OnPostSave(). 现在,例如,当删除 ID 为“4385”的行时,该行之后的所有项目都不会被绑定。关于斯科特·汉塞尔曼的这篇文章,这绝对有道理,但我想知道是否有解决办法?最好在发布到服务器之前不修改js中的表单。
提前致谢!
model-binding ×10
c# ×6
asp.net ×3
asp.net-mvc ×3
asp.net-core ×2
collections ×2
file-upload ×1
laravel ×1
php ×1
razor-pages ×1
routes ×1