作为一个刚刚开始使用MVC的相当有经验的ASP.Net开发人员,我发现自己正在努力将我的思维方式从传统的"服务器控件和事件处理程序"的处理方式转变为更加动态的MVC方式.我想我正在慢慢地到达那里,但有时MVC"魔法"会让我失望.
我目前的情况是创建一个网页,允许用户浏览本地文件,将其上传到服务器并重复此操作,直到他有一个要使用的文件列表.当他对文件列表(将在页面上的网格中显示)感到满意时,他将单击一个按钮来处理文件并提取将存储在数据库中的一些数据.
最后一部分并不是那么重要,现在我正在努力处理像构建文件列表这样简单的事情,并在请求之间保持该列表.在传统方法中,这将非常简单 - 数据将保存在ViewState中.但是在MVC中我需要在控制器和视图之间传递数据,而我并没有完全了解它应该如何工作.
我想我最好发布我的相当不完整的编码尝试来解释这个问题.
为了保存我的文件列表数据,我创建了一个viewmodel,它基本上是一个类型化的文件列表,还有一些额外的元数据:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
在视图中,我有一个用于浏览和上传文件的表单:
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
该视图使用viewmodel作为其模型:
@model MHP.ViewModels.ImportDataViewModel
Run Code Online (Sandbox Code Playgroud)
这会将文件发送到我的操作:
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
Run Code Online (Sandbox Code Playgroud)
此操作返回DataImport页面的视图以及包含文件列表的viewmodel实例.
这可以很好地工作到某一点,我可以浏览文件并上传它,我可以在动作中看到viewmodel数据,然后如果我在视图中放置一个断点并调试"this.Model",一切都是精细.
但是,如果我尝试上传另一个文件,在AddImportFile操作中放置断点时,importData参数为空.因此,视图显然没有将其模型的当前实例传递给操作.
在我经历的MVC示例中,模型实例被"神奇地"传递给action方法作为参数,那么为什么它现在为空呢? …
一方面,表单验证可以被视为应用程序逻辑的一部分,因此属于模型.
另一方面,它直接处理来自视图的输入并处理显示错误等.从这个角度来看,将它放入控制器更有意义.
从MVC的角度来看哪一个是正确的方法?
PS我的表单验证实际上只包括编写字段列表,它们的规则,并将其传递给表单验证库,它返回true/false是否通过验证.
例:
$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
//........
if ($this->form_validation->validate())
// Process data
else
$this->register_form(); //A controller action that will show a view with errors
Run Code Online (Sandbox Code Playgroud)
这应该放在控制器或模型中吗?
有人可以解释这3个概念以及它们之间在MVC框架方面的差异以及一个例子.对我来说,这些似乎几乎相同,似乎它们在某些文章中可互换使用,而在其他文章中则不然.
model-view-controller entity design-patterns model domain-object
我已经看到了一些线程,但似乎没有一个适用于MVC4,因为RadioButtonFor html扩展方法/帮助程序不存在.
说我有一个枚举列表 - 即航空公司:
public enum Airlines
{
Unknown = 0,
BritishAirways = 1,
VirginAtlantic = 2,
AirFrance = 3
}
Run Code Online (Sandbox Code Playgroud)
如何将其绑定到我的视图上的单选按钮列表,并能够检索所选项目?如果没有选择,可以说"选择一个项目"怎么样?
我有一个MVC项目,将向用户显示一些文档.这些文件当前存储在Azure blob存储中.
目前,从以下控制器操作中检索文档:
[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")]
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
// get byte array from blob storage
byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
string mimeType = "application/octet-stream";
return File(doc, mimeType, fileName);
}
Run Code Online (Sandbox Code Playgroud)
现在,当用户点击如下链接时:
<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf
Run Code Online (Sandbox Code Playgroud)
然后,该文件将下载到其浏览器的下载文件夹中.我想要发生的事情(我认为是默认行为)是文件只是在浏览器中显示.
我已经尝试更改mimetype并将返回类型更改为FileResult而不是ActionResult,两者都无济于事.
如何在浏览器中显示文件而不是下载?
我想创建一个独特的ID但是uniqid()给出类似的东西'492607b0ee414'.我想要的是类似于tinyurl给出的东西:'64k8ra'.越短越好.唯一的要求是它不应该有明显的顺序,它应该看起来比看似随机的数字序列更漂亮.字母比数字更受欢迎,理想情况下不会是混合字母.由于参赛人数不会那么多(最多10000人左右),因此碰撞的风险并不是一个很大的因素.
任何建议赞赏.
public string ContructOrganizationNameLogo(HttpPostedFileBase upload, string OrganizationName, int OrganizationID,string LangName)
{
var UploadedfileName = Path.GetFileName(upload.FileName);
string type = upload.ContentType;
}
Run Code Online (Sandbox Code Playgroud)
我想得到文件的扩展名来动态生成文件的名称.我将使用一种方法来分割类型.但我可以使用HttpPostedFileBase对象以干净的方式获得扩展吗?
在WebForm中,我们可以在MasterPage.cs中编写一个方法,并在每个请求中运行.
例如:
MasterPage.cs
--------------
protected void Page_Load(object sender, EventArgs e)
{
CheckCookie();
}
Run Code Online (Sandbox Code Playgroud)
我们怎么能在MVC中做这样的事情?
我需要能够在Linq查询中具有可选参数,或者如果需要从查询中删除该可选参数,则能够将查询分配给类似IF的var.
如果我在IF语句中设置查询var,那么当我尝试循环时,它告诉我var在上下文中不存在.
if (whichGroup == "All")
{
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr
select o
);
}
else
{
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
select o
);
}
foreach (var data in listOppLineData) //listOppLineData doesn't exist here
{
Run Code Online (Sandbox Code Playgroud)
我需要在我认为的IF语句之前设置var,但我不知道将它设置为什么.
var listOppLineData = ""; // gives me
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'
IQueryable listOppLineData = new IQueryable(); //gives me
Cannot create an instance of …Run Code Online (Sandbox Code Playgroud) $result = preg_replace(
"/\{([<>])([a-zA-Z0-9_]*)(\?{0,1})([a-zA-Z0-9_]*)\}(.*)\{\\1\/\\2\}/iseU",
"CallFunction('\\1','\\2','\\3','\\4','\\5')",
$result
);
Run Code Online (Sandbox Code Playgroud)
上面的代码在升级到PHP 5.5后给出了弃用警告:
不推荐使用:preg_replace():不推荐使用/ e修饰符,而是使用preg_replace_callback
如何更换代码preg_replace_callback()?
asp.net-mvc ×6
c# ×3
php ×3
action ×1
azure ×1
codeigniter ×1
entity ×1
iqueryable ×1
linq ×1
linq-to-sql ×1
model ×1
php-5.5 ×1
preg-replace ×1
state ×1
unique-index ×1
viewmodel ×1