标签: asp.net-mvc-viewmodel

将PagedList与viewmodel MVC 3一起使用

我试图用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

5
推荐指数
1
解决办法
2万
查看次数

使用ViewModel时不显示MVC3自定义验证错误消息

摘要

Question: 使用ViewModel时为什么不显示自定义验证错误消息。

Answer:自定义验证应应用于ViewModel而不是Class。有关示例代码,请参见@ JaySilk84答案的结尾。

MVC3,项目使用

  • jQuery的1.7.2.min.js
  • modernizr-2.5.3.js
  • jquery-ui-1.8.22.custom.min.js(由jQuery.com为Accordion插件生成)
  • jquery.validate.min.js和
  • jquery.validate.unobtrusive.min.js

我在项目中对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)

validation asp.net-mvc-3 asp.net-mvc-viewmodel

5
推荐指数
1
解决办法
7322
查看次数

MVC5 ViewModel未发回控制器

所以,我有一个控制器/视图/视图模型的问题.我认为它类似于这个问题.基本上,我有一个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)

c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-viewmodel

5
推荐指数
1
解决办法
4145
查看次数

使用Razor MVC3中的ViewModel在单个视图中显示多个模型(仅在视图中显示详细信息)

我的任务是在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)

c# razor asp.net-mvc-3 asp.net-mvc-viewmodel

4
推荐指数
1
解决办法
9763
查看次数

对我的ViewModel列表中的每个项目进行数据验证

要使用正则表达式进行验证,我通常会这样做:

// 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属性?

c# validation custom-attributes asp.net-mvc-viewmodel

4
推荐指数
1
解决办法
3677
查看次数

MVC验证在Knockoutjs帖子中丢失了

我正在使用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"填充字段.

这不是一个形式太复杂,所以如果可以避免,我不想引入一些新的验证层.我不介意有一个验证的帖子.

谢谢,丹

validation asp.net-mvc-4 knockout.js asp.net-mvc-viewmodel

3
推荐指数
1
解决办法
2264
查看次数

MVC ASP.NET没有为此对象定义的无参数构造函数

当我单击"提交"以创建帐户时,将显示以下错误.我无法找到它为什么会出现以下错误.我也尝试使用断点和调试,但它没用

没有为此对象定义的无参数构造函数.

描述:执行当前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)

asp.net-mvc viewmodel asp.net-mvc-3 asp.net-mvc-viewmodel

3
推荐指数
1
解决办法
2万
查看次数

每个视图的ASP.NET MVC 1 ViewModel?

我读过文章" 我们如何做MVC ".在规则#3中,表示"我们每个视图只有一个ViewModel类型".例如,当我们在mvc中搭建脚手架时,它会自动创建5个视图(创建,删除,详细信息,编辑和索引).通过该声明,是否意味着我们必须为该视图创建5个ViewModel?如果我的假设是错误的,那么使用ViewModels的最佳做法是什么?

c# asp.net-mvc viewmodel asp.net-mvc-viewmodel

3
推荐指数
1
解决办法
1616
查看次数

“ViewModel 行为”的定义是什么?

我一直在阅读有关 DTO 和 Viewmodel 之间的区别,其中主要的区别是 Viewmodel 中存在行为,而 DTO 仅通过层传输数据,但据我所知,并没有明确说明行为的定义。

Viewmodel 可以转换从 DTO 传入属性的数据,以针对特定视图以特定方式进行格式化,并且在 WPF 中,事件可以添加到 VM,这可以丰富其用途。那么,在本案中,“行为”究竟意味着什么呢?谢谢。

c# asp.net-mvc design-patterns dto asp.net-mvc-viewmodel

3
推荐指数
1
解决办法
714
查看次数

我们可以仅使用DTO代替ViewModel吗?

我们目前将DTO用于Web API请求和响应

并使用ViewModel将数据传递到MVC中的View

目前,我们有:

  1. DTO作为单独的项目
  2. ViewModel在UI项目中(与Controllers一起的另一个文件夹)

在我们的案例中,我看到的唯一区别是DTO必须通过导线传递并以JSON形式发送,而ViewModel必须在视图内部传递以呈现为HTML。

我们应该为MVC应用程序和我们的App /其他客户端保留单独的传输对象,还是仅通过DTO完成这两项工作,即在视图内部传递DTO,而不是在ViewModel上传递?它可能有什么缺点?

在这里阅读了许多回复但是在我们的案例中,没有示例,也没有令人信服的理由将ViewModel和DTO分开。

c# asp.net-mvc dto viewmodel asp.net-mvc-viewmodel

3
推荐指数
3
解决办法
2312
查看次数