我试图用viewmodel实现IPagedList,我的主视图声明是
@model PagedList.PagedList<CustomerOrders.WebUI.Models.SiteAdminListViewModel>
Run Code Online (Sandbox Code Playgroud)
然后我有一个显示模板,它具有以下声明
@model CustomerOrders.WebUI.Models.SiteAdminListViewModel
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我将viewmodel传递给视图
return View(new SiteAdminListViewModel(customerSites.ToPagedList(pageIndex, pageSize), customers.ToPagedList(pageIndex, pageSize)));
Run Code Online (Sandbox Code Playgroud)
这会导致错误,"此字典需要类型为'PagedList.PagedList 'PagedList.PagedList1 [CustomerOrders.WebUI.Models.SiteAdminListViewModel]' 的模型项
我理解错误是什么,但我不确定如何修改视图模型以包含PagedList,有没有其他人经历过这个或者有人能指出我正确的方向吗?
编辑////////////////
这是我的viewmodel
public class SiteAdminListViewModel
{
public IEnumerable<CustomerSite> CustomerSites { get; set; }
public IEnumerable<Customer> Customers { get; set; }
public Customer Cust { get; set; }
public CustomerSite CustSite { get; set; }
public bool HasPreviousPage { get; set; }
public bool HasNextPage { get; set; }
public int PageCount { get; set; }
public int PageNumber { get; set; …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc pagedlist asp.net-mvc-3 asp.net-mvc-viewmodel
摘要
Question: 使用ViewModel时为什么不显示自定义验证错误消息。
Answer:自定义验证应应用于ViewModel而不是Class。有关示例代码,请参见@ JaySilk84答案的结尾。
MVC3,项目使用
我在项目中对View中的数据注释和Controller中的ModelState.AddModelError进行了验证,因此我知道我已正确配置了所有验证代码。
但是,使用自定义验证时,代码中会生成错误,但不会显示错误消息。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{ if (DOB > DateTime.Now.AddYears(-18))
{ yield return new ValidationResult("Must be 18 or over."); } }
Run Code Online (Sandbox Code Playgroud)
在POST操作中深入调试时,自定义验证会导致模型状态失败,并且错误消息会放置在正确的值字段中,但是当将模型发送回视图时,不会显示错误消息。在控制器中,我还具有ModelState.AddModelError代码,并且确实显示了其消息。如何以一种方式而不是另一种方式来处理?如果不是这样,还有什么会阻止错误消息显示的?
更新1:
我正在使用ViewModel在视图中创建模型。我剥离了ViewModel并开始显示错误消息,将ViewModel重新添加回消息中后,它又停止显示了。有没有人成功地将自定义验证与ViewModel一起使用?您需要做些什么才能使其正常工作吗?
更新2:
我用这两个简单的类(Agency和Person)创建了一个新的MVC3项目。
public class Agency : IValidatableObject
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DOB { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (DOB > DateTime.Now.AddYears(-18)) { yield return new ValidationResult("Must …Run Code Online (Sandbox Code Playgroud) 所以,我有一个控制器/视图/视图模型的问题.我认为它类似于这个问题.基本上,我有一个viewmodel,我发送到我的控制器的视图.在将整个混乱发送回控制器后期操作之前,有些项目会显示,然后是一些其他字段供用户操作.当我在帖子中获取数据时,所有viewmodel都是空的.
所以,不用多说了,这里有一些代码可供参考:
视图模型:
public class ASideReceivingViewModel
{
public PurchaseOrderLine poLine;
public ReceivingItem receivingItem;
public Dictionary<string, string> TankerOrRailcarOptions { get; set; }
public ASideReceivingViewModel()
{
TankerOrRailcarOptions = new Dictionary<string, string>();
TankerOrRailcarOptions.Add("R", "Railcar");
TankerOrRailcarOptions.Add("T", "Tanker");
}
}
Run Code Online (Sandbox Code Playgroud)
控制器动作:
public ActionResult Receive(string strOrdNo, short? shtLineNo)
{
//if there isn't a selected po line, then shoot them back to the first page
if (strOrdNo == null || !shtLineNo.HasValue) return RedirectToAction("Index");
PurchaseOrderService poService = new PurchaseOrderService();
ReceivingItemService s = new ReceivingItemService(p);
ASideReceivingViewModel vm …Run Code Online (Sandbox Code Playgroud) 我的任务是在models一个视图中显示多个ViewModel.我已经为我的要求创建了一个但我不符合我的要求.请看下面的代码并纠正我哪里出错????
public partial class StudentsDetail
{
public int StudentID { get; set; }
public int ParentID { get; set; }
public string StudentName { get; set; }
public string Gender { get; set; }
public string FatherName { get; set; }
public string MotherName { get; set; }
public Nullable<System.DateTime> DateOfBirth { get; set; }
public virtual ParentsDetail ParentsDetail { get; set; }
public virtual SchoolDetail SchoolDetail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
//模型2
public partial class …Run Code Online (Sandbox Code Playgroud) 要使用正则表达式进行验证,我通常会这样做:
// In my ViewModel
[RegularExpression("MyRegex", ErrorMessageResourceName = "MyErrorMessage")]
public string MyField { get; set; }
Run Code Online (Sandbox Code Playgroud)
和HTML助手
@Html.TextBoxFor(model => model.MyField)
Run Code Online (Sandbox Code Playgroud)
生成一个如下所示的标记:
<input type="text" class="valid" name="MyField" value="" id="MyField" data-val="true" data-val-regex-pattern="MyRegex" data-val-regex="MyErrorMessage"></input>
Run Code Online (Sandbox Code Playgroud)
问题是我希望有一个动态数量的字段,现在正在使用
// In my ViewModel
[RegularExpression("MyRegex", ErrorMessageResourceName = "MyErrorMessage")]
public IList<string> MyField { get; set; }
Run Code Online (Sandbox Code Playgroud)
这次
@Html.TextBoxFor(model => model.MyField[0])
Run Code Online (Sandbox Code Playgroud)
将生成(没有正则表达式html属性)
<input id="MyField_0_" type="text" value="" name="MyField[0]"></input>
Run Code Online (Sandbox Code Playgroud)
如何data-val在我的ViewModel中绑定具有DataAnnotation验证属性的列表的元素时,如何确保创建html属性?
我正在使用MVC4和淘汰赛.我在页面上有一个表单,该表单是一个强类型的视图模型.在该视图模型中,我定义了一些验证,例如:
[Required(ErrorMessage = "Title is required")]
public string Title { get; set; }
Run Code Online (Sandbox Code Playgroud)
如果我在没有填写必填字段的情况下对表单执行标准发布,我的操作会看到模型无效并返回到视图,并且显示主验证消息,因为我@Html.ValidationSummary在表单中.单个字段也标记为无效(带有消息),因为我已@Html.ValidationMessageFor与该字段关联
所以我添加了淘汰赛,而不只是发布我现在打电话的表格ko.utils.postJson($("form")[0], self);.现在大多数都可以工作,如果我发布了未填充所需字段的表单,我的操作会检测到模型无效并返回到视图,除非现在没有显示单个验证消息.
帖子前填写的字段也会丢失.我尝试通过读取mvc viewmodel并将变量设置为这样的值来解决这个问题.
var model = @Html.Raw(Json.Encode(Model));
Run Code Online (Sandbox Code Playgroud)
然后在我的淘汰视图模型中设置该值
self.Title = ko.observable(model.Title);
Run Code Online (Sandbox Code Playgroud)
但是当我输入'1'时,当失败的帖子返回时,它会用'"1"填充字段.
这不是一个形式太复杂,所以如果可以避免,我不想引入一些新的验证层.我不介意有一个验证的帖子.
谢谢,丹
当我单击"提交"以创建帐户时,将显示以下错误.我无法找到它为什么会出现以下错误.我也尝试使用断点和调试,但它没用
没有为此对象定义的无参数构造函数.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.MissingMethodException:没有为此对象定义的无参数构造函数.
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
AccountController.cs
[HandleError]
public ActionResult CreateNewFixedBankAccount()
{
ViewBag.AccountFromList = new SelectList(
ManageAccount.Instance.GetAccounts(), "accountID", "name");
ViewBag.AccountTypes = new SelectList(ManageAccountType.Instance.GetNonFixedTypes(), "id", "type");
ViewBag.Durations = new SelectList(ManageDuration.Instance.GetAllDurations(), "id", "duration1");
ViewBag.Currencies = new SelectList(ManageCurrency.Instance.getCurrencies(), "id", "symbol");
return View();
}
//
// POST: /Account/CreateNewFixedBankAccount
[HttpPost]
[HandleError]
public ActionResult CreateNewFixedBankAccount(ViewModel.NewAccountViewModel model, string username)
{
return View();
}
___________________________________________________________________________________________
Run Code Online (Sandbox Code Playgroud)
CreateNewFixedBankAccount.cshtml 下面的提交按钮给出了错误
@model internetBankingApplication.ViewModel.NewFixedAccountViewModel
@{
ViewBag.Title = "CreateNewFixedBankAccount";
}
@using (Html.BeginForm())
{
ViewBag.Title = "Create";
Layout = "~/Views/Shared/_Layout.cshtml";
<fieldset>
<legend>Fixed Account Details</legend>
<div …Run Code Online (Sandbox Code Playgroud) 我读过文章" 我们如何做MVC ".在规则#3中,表示"我们每个视图只有一个ViewModel类型".例如,当我们在mvc中搭建脚手架时,它会自动创建5个视图(创建,删除,详细信息,编辑和索引).通过该声明,是否意味着我们必须为该视图创建5个ViewModel?如果我的假设是错误的,那么使用ViewModels的最佳做法是什么?
我一直在阅读有关 DTO 和 Viewmodel 之间的区别,其中主要的区别是 Viewmodel 中存在行为,而 DTO 仅通过层传输数据,但据我所知,并没有明确说明行为的定义。
Viewmodel 可以转换从 DTO 传入属性的数据,以针对特定视图以特定方式进行格式化,并且在 WPF 中,事件可以添加到 VM,这可以丰富其用途。那么,在本案中,“行为”究竟意味着什么呢?谢谢。
我们目前将DTO用于Web API请求和响应
并使用ViewModel将数据传递到MVC中的View
目前,我们有:
在我们的案例中,我看到的唯一区别是DTO必须通过导线传递并以JSON形式发送,而ViewModel必须在视图内部传递以呈现为HTML。
我们应该为MVC应用程序和我们的App /其他客户端保留单独的传输对象,还是仅通过DTO完成这两项工作,即在视图内部传递DTO,而不是在ViewModel上传递?它可能有什么缺点?
c# ×7
asp.net-mvc ×6
validation ×3
viewmodel ×3
dto ×2
asp.net ×1
knockout.js ×1
pagedlist ×1
razor ×1