我是.Net开发的新手,现在正在关注NerdDinner教程.只是想知道你们中是否有人能告诉我
ViewData和ViewModel之间有什么区别
(我所知道的是他们习惯于将某些形式的数据从控制器传递到视图)并且可能告诉我应该在什么情况下使用ViewData而不是ViewModel,反之亦然
提前致谢!
出击
我有两个列表,我想返回视图,'添加'和'删除'.但是目前我只能返回'已添加'或'已删除'.我怎样才能在一个对象中返回?我对MVC很新,所以如果这段代码很乱,请道歉!
public ActionResult Index()
{
// Excel upload history
var fptexcel = db.FPTStaticDataRatedFinancialAssetBase
.OrderBy(e => e.FORATExcelId)
.Select(e => e.FORATExcelId).Max();
var fptexcelprevious = fptexcel - 1;
var newassets = db.FPTStaticDataRatedFinancialAssetBase.OfType<FPTStaticDataRatedFinancialAssetBase>()
.Where(c => c.FORATExcelId == fptexcel || c.FORATExcelId == fptexcelprevious)
.GroupBy(x => x.Name)
.Where(c => c.Count() == 1)
.Select(y => y.FirstOrDefault()).ToList();
var added = db.FPTStaticDataRatedFinancialAssetBase.OfType<FPTStaticDataRatedFinancialAssetBase>()
.Where(x => x.FORATExcelId == fptexcelprevious)
.Select(x => x).ToList();
var removed = db.FPTStaticDataRatedFinancialAssetBase.OfType<FPTStaticDataRatedFinancialAssetBase>()
.Where(x => x.FORATExcelId == fptexcel)
.Select(x => x).ToList();
return View(newassets.Except(added).ToList());
}
Run Code Online (Sandbox Code Playgroud) 我正在更改创建表单以成为模式对话框和jquery Unobtrusive验证停止工作,不知道如何解决它.
Index.cshtml有一个触发模式对话框的链接.
<a href="#" id="createCustomer">Create</a>
@section scripts{
<script type="text/javascript">
$('#createCustomer').on('click', function () {
$.get('/Customer/Create', function (data) {
$('#modalContainer').html(data);
$('#myModal').modal({});
});
});
Run Code Online (Sandbox Code Playgroud)
Create.cshtml是局部视图.
@model Demo.Web.Models.CustomerVm
@using (Html.BeginForm("Create", "Customer", FormMethod.Post, new { @id="createForm" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Customer</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
@section Scripts …Run Code Online (Sandbox Code Playgroud) asp.net-mvc data-annotations unobtrusive-validation asp.net-mvc-viewmodel
我有一个DropDownLists的编辑器模板,标有这样的属性:
[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute
{
public string SelectListName { get; set; }
public DropDownListAttribute(string selectListName)
: base("DropDownList", "MVC", selectListName)
{
SelectListName = selectListName;
}
}
Run Code Online (Sandbox Code Playgroud)
它本身看起来像这样:
@using Comair.RI.UI.Core
@{
var list = this.GetModelSelectList();
var listWithSelected = new SelectList(list.Items, list.DataValueField, list.DataTextField, Model);
}
@Html.DropDownListFor(m => Model, listWithSelected, " - select - ")
Run Code Online (Sandbox Code Playgroud)
我的问题是它只验证服务器端,这对于用户解决所有客户端验证非常烦人,只是提交并获得新的,意外的服务器端验证.
asp.net-mvc data-annotations asp.net-mvc-4 asp.net-mvc-viewmodel
我刚开始学习ASP.NET MVC中的ViewModel.所以,我想实现一个示例如下:
商业实体
public class AddModel
{
public int a { get; set; }
public int b { get; set; }
public int Add()
{
return (this.a + this.b);
}
}
Run Code Online (Sandbox Code Playgroud)
添加ViewModel
public class AddViewModel
{
public AddModel addModel;
public int Total { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
调节器
public class AddController : Controller
{
[HttpPost]
public JsonResult Add(AddViewModel model)
{
int iSum = model.addModel.a + model.addModel.b;
model.Total = iSum;
return Json(model);
}
public ActionResult Index()
{
return View();
}
} …Run Code Online (Sandbox Code Playgroud) 在我的ViewModel中有一个需要2行标签的属性,但是当我<br />在DisplayName属性中放置HTML代码时,会将HTML代码打印到页面而不是被解释为换行符.有没有办法DisplayName让它有一个换行符呢?
视图:
<tr>
<td>
@Html.LabelFor(m => m.GrossGallons)
</td>
<td>
</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
视图模型:
[DisplayName("Gross Gallons <br /> (Max: 6,000)")]
public decimal GrossGallons { get; set; }
Run Code Online (Sandbox Code Playgroud)
输出试图得到:
Gross Gallons
(Max: 6,000)
Run Code Online (Sandbox Code Playgroud) 我目前在我的MVC项目的HomeController中有以下代码:
public class HomeController : Controller
{
public ActionResult Index()
{
MyDataContext dc = new MyDataContext();
IQueryable<Table1Data> j =
from n in dc.Table1
select n;
return View(j);
}
Run Code Online (Sandbox Code Playgroud)
这样可行,但现在我想将第二个表传递到同一个视图.所以我在想我应该能做这样的事情:
public class HomeController : Controller
{
public ActionResult Index()
{
MyDataContext dc = new MyDataContext();
IQueryable<Table1Data> j =
from n in dc.Table1
select n;
IQueryable<Table2Data> l =
from k in dc.Table2
select k;
return View(j, l);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法有观点接受两个模型是这样,或者,一个方法来合并两个结果集(这两个表没有以任何方式联系?
有没有办法在没有自定义模型绑定的情况下处理这个问题?
public class MyViewModel {
public string UserId { get; set; }
public IJob Job { get; set; }
}
public interface IJob {
public long Id { get; set; }
public string CompanyName { get; set; }
}
public class FullTimeJob : IJob {
// omitted for brevity
}
public class Internship : IJob {
// omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我在默认模型绑定器中遇到错误,因为它不了解实例化IJob的实现.当我创建MyViewModel时,我将FullTimeJob的实例设置为其Job属性.我猜ASP.NET不能保留实现类型?
什么是最佳实践解决方案?
我会尽力直截了当.我在StackOverflow上有一些构建ViewModel的帮助.它在MVC 4中运行良好但现在我将应用程序转换为MVC 5它无法正常工作.代码方式没有任何改变.我有一个_navigation.cshtml,它是在我的Layout.cshtml中呈现的部分,并且错误在该Partial中的For循环内.这个代码在MVC 4中工作正常.这是代码:
我的错误是在for循环期间的部分页面中,我Ingredient在行中得到错误:
@foreach (Ingredient ingredient in Model.Ingredients)
Run Code Online (Sandbox Code Playgroud)
也可以在同一个地方的任何其他地方循环.错误说:
找不到类型或命名空间名称'Recipe'(您是否缺少using指令或程序集引用?)
这是我的代码:
型号/ Ingredient.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace XXX.Models
{
public class Ingredient
{
public int IngredientID { get; set; }
public string IngredientNameEs { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
型号/ Recipe.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace XXX.Models
{
public class Recipe
{
public int RecipeID { get; set; }
public string RecipeNameEs { get; set; }
} …Run Code Online (Sandbox Code Playgroud) c# runtime-error asp.net-mvc-4 asp.net-mvc-viewmodel asp.net-mvc-5
在控制器的MVC中,您应该从DB获取Model并将其转换为ViewModel,然后再将其发送到View.通常使用像Automapper这样的东西.
我的问题是,如果你需要在视图中显示模型的所有属性,是否值得创建一个ViewModel?
如果Model和ViewModel需要相同,那么创建ViewModel会在应用程序中创建一些安全性或好处,或者我们只是增加了不必要的复杂性?