我正在ASP.NET MVC 2中构建一个允许匿名用户和注册用户的站点.当用户登录时,我想在每个页面上显示与该配置文件相关的多条信息(即家乡,喜欢的颜色等).从视角来看,我理解使用母版页并创建局部图来保持干燥.
但是,我遇到的问题是如何将此用户信息传递给每个页面的视图?我已经建立了数据库表之间的关系(我正在使用EF),因此我可以通过ViewData对每个操作进行单独的操作,但这对于网站上的每个页面来说显然都是荒谬的.
到目前为止,我的研究已经开始引领我走上创建其他控制器和视图模型将继承的基本控制器和基本视图模型的道路.但我觉得我错过了一些明显的东西.有什么指针吗?
嗨,我想知道是否有人在我的asp.net mvc3网站上实现页面列表代码(https://github.com/TroyGoode/PagedList)时遇到的一个问题.这是我尝试做的细节:
我用这个细节创建了一个Viemodel:
public class ProductViewModelList
{
public List<Product> ProductBrowse { get; set; }
public int NumberOfProducts { get; set; }
public List<Category> CategoryModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后控制器保存我想传递给视图的信息:
public ActionResult List(int categoryid, int? page)
{
const int defaultPageSize = 20;
int currentPageIndex = page.HasValue ? page.Value - 1 : 0;
var categoryModel = db.Category.Include("Product").Single(c => c.CategoryId == categoryid);
var paginatedmodel = categoryModel.Product.ToPagedList(currentPageIndex, defaultPageSize);
var viewModel = new ProductViewModelList
{
ProductBrowse = paginatedmodel.ToList(),
NumberOfProducts = categoryModel.Product.Count()
};
return View(viewModel); …Run Code Online (Sandbox Code Playgroud) 我是AutoMapper的新手,我一直在阅读和阅读这里的问题,但我无法弄清楚什么看起来像一个非常微不足道的问题.
首先是我的课程,然后是问题:
GatewayModel.cs
public class Gateway
{
public int GatewayID { get; set; }
public List<Category> Categories { get; set; }
public ContentType ContentType { get; set; }
// ...
}
public class Category
{
public int ID { get; set; }
public int Name { get; set; }
public Category() { }
public Category( int id ) { ID = id; }
public Category( int id, string name ) { ID = id; Name = name; }
}
public …Run Code Online (Sandbox Code Playgroud) 我有2个这样的视图模型:
public class ViewModel1 // maps to Model1
{
public string ViewModel1Desc { get; set; }
public ViewModel2 ViewModel2 { get; set; }
public ScheduleMasterEditViewModel()
{
ViewModel2= new ViewModel2();
}
}
public class ViewModel2 // maps to Model2
{
public string ViewModel2Desc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望有一个ViewModel2的部分页面,并将其包含在ViewModel1的创建页面中:
Create.cshtml看起来像这样
@model ViewModels.ViewModel1
@using (Html.BeginForm()) {
@Html.EditorFor(model => model.ViewModel1Desc )
@Html.Partial("~/Views/ViewModel2/_ViewModel2Create.cshtml", Model.ViewModel2)
}
Run Code Online (Sandbox Code Playgroud)
_ViewModel2Create.cshtml看起来像
@model ViewModels.ViewModel2
@Html.EditorFor(model => model.ViewModel2Desc )
Run Code Online (Sandbox Code Playgroud)
问题是,在Model1的Create控制器上,没有任何内容绑定到ViewModel1.ViewModel2
我是以正确的方式做到这一点,还是应该写出所有这样的字段:
我想知道转换的一个好办法Model来ViewModel,并ViewModel以Model没有AutoMapper或类似的东西,因为我想知道背后是什么,并学习如何做我自己.当然,模型I指的是EF生成的类.
到目前为止,我做了类似的事情,但是当涉及到嵌套类时会遇到一些问题:
// to VM
public static Author ToViewModel(EntityAuthor author)
{
if (author == null)
return null;
Author result = new Author();
result.Id = author.ATH_ID;
result.FirstName = author.ATH_FirstName;
result.LastName = author.ATH_LastName;
return result;
}
public static BlogPost ToViewModel(EntityBlogPost post)
{
if (post == null)
return null;
Experiment result = new Experiment();
result.Id = post.BP_ID;
result.Title = post.BP_Title;
result.Url = post.BP_Url;
result.Description = post.BP_Description;
result.Author = ToViewModel(post.Author);
return result;
}
// …Run Code Online (Sandbox Code Playgroud) 目前我正在使用Asp.Net MVC:存储库,工作单元模式,服务层和ViewModel.
在此项目中,每个View都链接到ViewModel类,控制器是瘦的,因此业务层驻留在服务层上.
我在Controller中创建ViewModel类的实例,并将其传递给视图
public ActionResult Create()
{
EventCreateViewModel eventViewModel = new EventCreateViewModel();
return View(eventViewModel);
}
Run Code Online (Sandbox Code Playgroud)
在一些ViewModel中,我用来调用服务层.
系统有效,但我想知道在ViewModel中添加对服务层的调用是否是一个好主意,或者更好的方法是将此操作仅留给Controller.
public class EventCreateViewModel
{
public CandidateListViewModel CandidateList = new CandidateListViewModel();
public EventCreateViewModel()
{
DateTimeStart = DateTime.UtcNow; // Add a default value when a Date is not selected
}
}
}
Run Code Online (Sandbox Code Playgroud)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using XXX.Models;
using XXX.Service;
namespace XXX.ViewModels
{
public class CandidateListViewModel
{
// …Run Code Online (Sandbox Code Playgroud) 以下是问题的简化版本:
<div id="model-one-container" data-bind="css: {foo: someModelOneProperty}">
<div id="model-two-container" data-bind="text: someModelTwoProperty"></div>
<div data-bind="text: anotherModelOneProperty"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
.
ko.applyBindings(viewModelOne, document.getElementById("model-one-container"));
ko.applyBindings(viewModelTwo, document.getElementById("model-two-container"));
Run Code Online (Sandbox Code Playgroud)
如果我这样做,淘汰赛会抱怨viewModelOne中没有"someModelTwoProperty",所以我需要从第一个applyBindings中排除#model-two-container div.
有没有办法在不改变视图模型的情况下做到这一点?
这个问题之前已被其他人提出过,但仍然没有得到它.我正在使用MVC3 Razor,我有屏幕输入故障单.输入数据(textarea note)后,控制器将重定向回同一屏幕.大多数数据仅供显示.如果我使用DisplayFor或DisplayTextFor,则不会回发数据.我使用过HiddenFor.这样可行.但是,我一直听到别人说HiddenFor不理想.我不想编辑因为,我想轻松禁用该字段.(我跟着工作说HiddenFor错了,但不会说原因.:<lol)
剃刀
@Html.DisplayTextFor(m => m.Ticket.Name)
Run Code Online (Sandbox Code Playgroud)
视图模型
public class TicketDetailsViewModel
{
[DisplayName("Customer Name")]
public string Name { get; set; }
Control
[HttpPost]
public ActionResult Detail(TicketDetailsViewModel viewModel)
return RedirectToAction("Detail");
Run Code Online (Sandbox Code Playgroud) 我试图在具有多个命令绑定的DataGrid上创建ContextMenu.一些必须绑定到本地ViewModel(即行的ViewModel),一些绑定到父级ViewModel.
到目前为止,我没有运气跟随其他解决方案.我只能执行SubCommand.
MainViewModel
public class MainViewModel : ViewModelBase
{
public ObservableCollection<SubViewModel> Items { get; private set; }
public MainViewModel()
{
Items = new ObservableCollection<SubViewModel>();
Items.Add(new SubViewModel());
Items.Add(new SubViewModel());
}
private RelayCommand _mainCommand;
public ICommand MainCommand
{
get
{
if (_mainCommand == null)
{
_mainCommand = new RelayCommand(
() =>
{
Debug.WriteLine("MAINCOMMAND EXECUTED");
}
);
}
return _mainCommand;
}
}
}
Run Code Online (Sandbox Code Playgroud)
SubViewModel
public class SubViewModel : ViewModelBase
{
private RelayCommand _subCommand;
public ICommand SubCommand
{
get
{
if (_subCommand == null) …Run Code Online (Sandbox Code Playgroud) 我有Viewmodel:
public class PartnerSearchResultVM
{
public int Id { get; set; }
public string Name { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public double Distance { get; set; }
public string Classification { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我从数据库得到距离,如下所示:2354,58764478263 m
我想要2.35公里
如何更改Viewmodel以在那里进行转换(如果它是最好的位置)
viewmodel ×10
asp.net-mvc ×6
c# ×4
automapper ×1
bind ×1
binding ×1
datagrid ×1
javascript ×1
knockout.js ×1
mapping ×1
model ×1
nested ×1
pagedlist ×1
partials ×1
razor ×1
view ×1
wpf ×1