ASP.NET MVC 应用程序初学者常见问题汇总

ASP.NET MVC 应用程序初学者常见问题汇总

Q: 如何为Html.TextBoxFor控件添加多个属性?

A: @Html.TextBoxFor(m => m.Email, new Dictionary<string, object>() { {"class", "input-material" }, {"data-msg", "Please enter your username" },{ "required", "true"} })

Q: 如何为输出HTML格式的字符串?

A: 输出HTML格式的文本主要使用@Html.Raw。如果文本是Model的属性:@Html.Raw(Model.HTMLText);如果文本是@foreach中的子项属性:@Html.Raw(item.HTMLText)

Q: 如何在视图中添加下拉框?

A: @Html.DropDownListFor(m => m.PropertyName, ViewBag.PropertyList as List<SelectListItem>, "-请选择-"),第三个参数用于在下拉框中添加一个默认值。

var propertyList = new List<SelectListItem>();
propertyList.Add(new SelectListItem() { Text = "", Value = "" });
ViewBag.PropertyList=propertyList;

Q: 如何使用input标签上传文件?

A: 视图文件内容

@using(Html.BeginForm("Upload","Home",FormMethod.Post,new { enctype = "multipart/form-data" }))
{
    <input type="file" id="fileupload" name="fileupload" size="25" /><input type="submit" value="上传"/>
}

Action核心代码

var file = Request.Files["fileupload"];
var newFileName = file.FileName.Substring(file.FileName.LastIndexOf(@"") + 1);
var filepath = "/Uploads/" + Guid.NewGuid() + newFileName;
file.SaveAs(Server.MapPath(filepath));

Q: 如何扩展User.Identity的可用方法(类似GetUserName方法)?

A:C#3.0时引入了扩展方法(Extension Methods)特性,由于User.Identity为IIdentity接口,因此,我们只需要扩展IIdentity接口的方法即可。

在模型文件夹中创建一个名为Extensions的新文件夹,并在Extensions文件夹中添加一个新类:IIdentityEx.cs

using System.Security.Claims;
using System.Security.Principal;

namespace xx.Models.Extensions{
    public static class IIdentityEx
    {
        public static string GetEmail(this IIdentity identity)
        {
            var claim = ((ClaimsIdentity)identity).FindFirst("Email");
            return (claim != null) ? claim.Value : string.Empty;
        }
    }
}

修改IdentityModels.cs文件中ApplicationUser类的GenerateUserIdentityAsync方法:

    public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // 请注意,authenticationType 必须与 CookieAuthenticationOptions.AuthenticationType 中定义的相应项匹配
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            
            // 在此处添加自定义用户声明
            userIdentity.AddClaim(new Claim("Email", this.Email.ToString()));

            return userIdentity;
        }
    }

在任意视图文件中添加@using xx.Models.Extensions后,就可以像使用@User.Identity.GetUserName()一样使用@User.Identity.GetEmail()来获取用户Email信息了。