小编ter*_*ško的帖子

ASP.Net MVC和状态 - 如何在请求之间保持状态

作为一个刚刚开始使用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方法作为参数,那么为什么它现在为空呢? …

asp.net-mvc state action viewmodel

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

MVC问题:我应该在控制器或模型中放置表单验证规则吗?

一方面,表单验证可以被视为应用程序逻辑的一部分,因此属于模型.

另一方面,它直接处理来自视图的输入并处理显示错误等.从这个角度来看,将它放入控制器更有意义.

从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)

这应该放在控制器或模型中吗?

php codeigniter

50
推荐指数
4
解决办法
2万
查看次数

区分域,模型和实体与MVC

有人可以解释这3个概念以及它们之间在MVC框架方面的差异以及一个例子.对我来说,这些似乎几乎相同,似乎它们在某些文章中可互换使用,而在其他文章中则不然.

model-view-controller entity design-patterns model domain-object

48
推荐指数
4
解决办法
4万
查看次数

MVC4枚举和单选按钮列表

我已经看到了一些线程,但似乎没有一个适用于MVC4,因为RadioButtonFor html扩展方法/帮助程序不存在.

说我有一个枚举列表 - 即航空公司:

public enum Airlines
{
   Unknown = 0,
   BritishAirways = 1,
   VirginAtlantic = 2,
   AirFrance = 3
}
Run Code Online (Sandbox Code Playgroud)

如何将其绑定到我的视图上的单选按钮列表,并能够检索所选项目?如果没有选择,可以说"选择一个项目"怎么样?

asp.net-mvc asp.net-mvc-4

48
推荐指数
3
解决办法
6万
查看次数

在浏览器中打开文件而不是下载它

我有一个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,两者都无济于事.

如何在浏览器中显示文件而不是下载?

c# asp.net-mvc azure

48
推荐指数
2
解决办法
6万
查看次数

php中的短唯一ID

我想创建一个独特的ID但是uniqid()给出类似的东西'492607b0ee414'.我想要的是类似于tinyurl给出的东西:'64k8ra'.越短越好.唯一的要求是它不应该有明显的顺序,它应该看起来比看似随机的数字序列更漂亮.字母比数字更受欢迎,理想情况下不会是混合字母.由于参赛人数不会那么多(最多10000人左右),因此碰撞的风险并不是一个很大的因素.

任何建议赞赏.

php uniqueidentifier unique-index

47
推荐指数
7
解决办法
7万
查看次数

asp.net mvc获取HttpPostedFileBase文件扩展名

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对象以干净的方式获得扩展吗?

asp.net-mvc file-extension

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

在MVC,C#中的每个请求中运行一个方法?

在WebForm中,我们可以在MasterPage.cs中编写一个方法,并在每个请求中运行.
例如:

MasterPage.cs
--------------
protected void Page_Load(object sender, EventArgs e)
{
   CheckCookie();
}
Run Code Online (Sandbox Code Playgroud)

我们怎么能在MVC中做这样的事情?

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

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

实例化空IQueryable以用于Linq to sql

我需要能够在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)

c# linq asp.net-mvc iqueryable linq-to-sql

47
推荐指数
4
解决办法
6万
查看次数

使用preg_replace_callback替换已弃用的preg_replace/e

$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()

php preg-replace preg-replace-callback php-5.5

47
推荐指数
1
解决办法
10万
查看次数