我已经告诉过我应该使用FileResult来允许用户从我的Asp.Net MVC应用程序下载文件.但我能找到的唯一例子总是与图像文件有关(指定内容类型image/jpeg).
但是,如果我不知道文件类型怎么办?我希望用户能够从我网站的文件区下载几乎任何文件.
我已经阅读了一个这样做的方法(参见前面的代码文章),实际上工作正常,除了一件事:"另存为"对话框中出现的文件名与带有下划线的文件路径连接在一起( folder_folder_file.ext).此外,似乎人们认为我应该返回一个FileResult而不是使用我找到BinaryContentResult的自定义类.
有人知道在MVC中进行这种下载的"正确"方式吗?
编辑:我得到了答案(下面),但我想如果其他人感兴趣我应该发布完整的工作代码:
public ActionResult Download(string filePath, string fileName)
{
string fullName = Path.Combine(GetBaseDir(), filePath, fileName);
byte[] fileBytes = GetFile(fullName);
return File(
fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
byte[] GetFile(string s)
{
System.IO.FileStream fs = System.IO.File.OpenRead(s);
byte[] data = new byte[fs.Length];
int br = fs.Read(data, 0, data.Length);
if (br != fs.Length)
throw new System.IO.IOException(s);
return data;
}
Run Code Online (Sandbox Code Playgroud) 我已经在我的应用程序中实现了对我在互联网上的一些博客文章中阅读的信息后的CSRF攻击的缓解.特别是这些帖子是我实施的驱动力
基本上这些文章和建议说,为了防止CSRF攻击,任何人都应该实现以下代码:
1)添加[ValidateAntiForgeryToken]接受POST Http动词的每个动作
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SomeAction( SomeModel model ) {
}
Run Code Online (Sandbox Code Playgroud)
2)在<%= Html.AntiForgeryToken() %>向服务器提交数据的表单中添加帮助程序
<div style="text-align:right; padding: 8px;">
<%= Html.AntiForgeryToken() %>
<input type="submit" id="btnSave" value="Save" />
</div>
Run Code Online (Sandbox Code Playgroud)
无论如何,在我的应用程序的某些部分,我正在使用jQuery对服务器进行Ajax POST,而根本没有任何形式.例如,当我让用户点击图像来执行特定操作时,会发生这种情况.
假设我有一个包含活动列表的表.我在表的一列上有一个图像,上面写着"将活动标记为已完成",当用户点击该活动时,我正在进行Ajax POST,如下例所示:
$("a.markAsDone").click(function (event) {
event.preventDefault();
$.ajax({
type: "post",
dataType: "html",
url: $(this).attr("rel"),
data: {},
success: function (response) {
// ....
}
});
});
Run Code Online (Sandbox Code Playgroud)
我如何<%= Html.AntiForgeryToken() %>在这些情况下使用?我应该在Ajax调用的data参数中包含帮助器调用吗? …
简单的问题是,如果您使用ASP.NET MVC Framework 1中的Html Helper,则很容易在文本框上设置默认值,因为存在过载Html.TextBox(string name, object value).当我尝试使用Html.TextBoxFor方法时,我的第一个猜测是尝试以下哪些不起作用:
<%: Html.TextBoxFor(x => x.Age, new { value = "0"}) %>
Run Code Online (Sandbox Code Playgroud)
我现在应该坚持使用Html.TextBox(字符串,对象)吗?
我正从数据库中检索两个日期时间值.一旦检索到值,我需要两个值之间的差异.为此,我创建了一个时间跨度变量来存储2个日期值的差异.
TimeSpan? variable = datevalue1 - datevalue2;
Run Code Online (Sandbox Code Playgroud)
现在我需要以小时数的形式显示存储在Timespan变量中的差异.我提到了TimeSpan.TotalHours但由于某种原因无法应用它.我怎么做?我在MVC项目上使用C#.我只需要以小时显示差异值?
编辑:由于时间跨度可以为空,我无法使用总小时数属性.现在我可以通过做TimeSpanVal.Value.TotalHours来使用它 ;
我在检查我的数据库Create(FooViewModel fvm){...},看是否fvm.prop1和fvm.prop2在该组合已经存在; 如果是这样,我想向modelstate添加一个错误,然后返回整个视图.我试过了:
public ActionResult Create(FooViewModel fvm){
if (ThatComboAlreadyExists(fvm)) {
ModelState.AddModelError("Model", "There is already one like that");
return View(fvm);
}
}
Run Code Online (Sandbox Code Playgroud)
...但我没有显示错误Html.ValidationSummary,这是我认为它们会出现的地方.我怀疑"模型"不是正确的关键,但我一直无法找到任何谷歌.
我有一个共享的母版页,我在我的mvc 2应用程序中使用了2个不同的区域.母版页有一个动作链接,当前指定控制器和动作,但当然如果我在错误的区域,链接不起作用.我认为带有区域参数的actionlink没有重载,是否可以这样做?
除了它返回的类型以及你当然以不同方式调用它的事实
<% Html.RenderPartial(...); %>
<%= Html.Partial(...) %>
Run Code Online (Sandbox Code Playgroud)
如果它们不同,你为什么要打电话给一个而不是另一个?
定义:
// Type: System.Web.Mvc.Html.RenderPartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll
using System.Web.Mvc;
namespace System.Web.Mvc.Html
{
public static class RenderPartialExtensions
{
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);
public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model,
ViewDataDictionary viewData);
}
}
// …Run Code Online (Sandbox Code Playgroud) 在ASP.NET MVC 2中,我想写一个非常简单的下拉列表,它给出了静态选项.例如,我想提供"红色","蓝色"和"绿色"之间的选择.
好的,以前有人问过,但那里没有可靠的解决方案.所以为了我自己和其他可能觉得有用的人的目的.
在MVC2(ASP.NET)中我想要它,所以当有人导航到网站时,指定了一个默认区域.因此,导航到我的站点应该会将您发送到AreaZ中的ControllerX ActionY.
在Global.asax中使用以下路由
routes.MapRoute(
"Area",
"",
new { area = "AreaZ", controller = "ControllerX ", action = "ActionY " }
);
Run Code Online (Sandbox Code Playgroud)
现在,这样可以尝试提供正确的页面.但是,MVC继续在站点的根目录中查找View,而不是在Area文件夹中查找.
有办法解决这个问题吗?
编辑
有一个'解决方案',即在ControllerX中,ActionY返回视图的完整路径.一点点黑客但它确实有效.但是我希望有更好的解决方案.
public ActionResult ActionY()
{
return View("~/Areas/AreaZ/views/ActionY.aspx");
}
Run Code Online (Sandbox Code Playgroud)
编辑:
当具有页面的HTML ActionLink时,这也成为一个问题.如果未设置该区域,则"操作链接"输出为空白.
所有这些都是设计还是缺陷?
Asp.Net MVC 2.0预览版提供了类似的帮助程序
Html.EditorFor(c => c.propertyname)
Run Code Online (Sandbox Code Playgroud)
如果属性名称是字符串,则上面的代码呈现texbox.
如果我想将MaxLength和Size属性传递给文本框或我自己的css类属性,该怎么办?
我是否需要在我的应用程序中为每种大小和长度组合创建一个模板?如果是这样,那么不会使默认模板可用.
asp.net-mvc-2 ×10
c# ×5
asp.net-mvc ×4
asp.net ×2
ajax ×1
csrf ×1
datetime ×1
html-helper ×1
modelstate ×1
timespan ×1