MVC开发小结
哎,发现我已经很久没有写文章了,懒惰啊...最近在忙一个基于MVC模式的门户网站。对于一个之前没有接触MVC的我,又得从零开始。所以开发中遇到不少麻烦,现在项目也接近完毕,故作此文铭记。我知道MVC都出到3.0了,但由于我的开发工具是vs08,所以还是只能用MVC 1.0。高手别见笑啊,我知道我out fashion了…
Form 表单提交:
有时Form表单中间肯定不止一个submit,这时我们肯定要对这些submit做一些识别,不然提交到的都是同一个Controller,那就不好啦。其实这里很啰嗦,因为前辈们都总结好了,哎,我写给自己看,都说是备忘么…
1、 客户端脚本。缺点:有点死板,逻辑相似时根本没必要分开两个action。
示例:<%using (Html.BeginForm())
{ %>
<input type = "submit" name = "btn" onclick = 'this.form.action="<%=Url.Action("about") %>";'/>
<input type = "submit" onclick ='this.form.action="<%=Url.Action("FileUP") %>";'/>
<%} %>
2、 在Action中判断通过哪个按钮提交
提交按钮定义相同的name属性,比如name = “action”,并且指定value。这样在controller中就可以判断是否action等于那个value来处理不同代码。
3、使用ActionSelector,
Controller:
以下为引用的内容:
[HttpPost]
[MultiButton(Name = "delete", Argument = "id")]
public ActionResult Delete(string id)
{
var response = System.Web.HttpContext.Current.Response;
response.Write("Delete action was invoked with " + id);
return View();
}
View:
以下为引用的内容:
<input type="submit" value="not important" name="delete" />
<input type="submit" value="not important" name="delete:id" />
MultiButtonAttribute定义:
以下为引用的内容:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
var key = ButtonKeyFrom(controllerContext);
var keyIsValid = IsValid(key);
if (keyIsValid)
{
UpdateValueProviderIn(controllerContext, ValueFrom(key));
}
return keyIsValid;
}
private string ButtonKeyFrom(ControllerContext controllerContext)
{
var keys = controllerContext.HttpContext.Request.Params.AllKeys;
return keys.FirstOrDefault(KeyStartsWithButtonName);
}
private static bool IsValid(string key)
{
return key != null;
}
private static string ValueFrom(string key)
{
var parts = key.Split(":".ToCharArray());
return parts.Length < 2 ? null : parts[1];
}
private void UpdateValueProviderIn(ControllerContext controllerContext, string value)
{
if (string.IsNullOrEmpty(Argument)) return;
controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult(value, value, null);
}
private bool KeyStartsWithButtonName(string key)
{
return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase);
}
}
Form上传
View:
<form enctype="multipart/form-data" method = "post">
<input type = "file" name = "fileUp"/><input type = "submit" onclick ='this.form.action="<%=Url.Action("FileUP") %>";'/>
</form>
Controller:
public ActionResult FileUp(HttpPostedFileBase fileUp)
{
fileUp.SaveAs(Server.MapPath("~/Content/"+fileUp.FileName));
return Content(fileUp.FileName);
}
为什么要加红色那块呢?
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功。可以通过直接在url中传参。
Html.DropDownList
这个其实有很多种写法,蛮灵活的。也可以直接用html的select来写;
1、<%=Html.DropDownList("ddl")%>
2、<select name = "sl"><option>请选择...</option>
<%foreach (var item in ViewData["ddl"] as SelectList)
{ %>
<option value = "<%=item.Value%>"><%=item.Text%></option>
<%} %>
</select>
3、<select name="sl">
<option value="1">a</option>
<option value="2">b</option>
</select>
前面两种方法需要在controller中动态绑定:
List<SelectListItem> list = new List<SelectListItem>{
new SelectListItem{Text = "a",Value = "1"},new SelectListItem{ Text="b",Value = "2"}
};
ViewData["ddl"] = new SelectList(list,"Value","Text");
return View();
Html.RadioButton
需要指定相同的name,不同的value(男、女)。controller中判断name等于哪个value
MVC实现GridView、新闻列表等+分页
https://files.cnblogs.com/conger/MyGridView.rar
具体大家可以参照这个例子。很有趣的是利用这个不仅可以实现GridView,几乎其他列表要求分页都可以实现。不信你试试!
截个成果给大家:
其实不难,只要根据你想实现的效果修改一下就行。
posted on 2011-12-02 17:03 congplayer 阅读(1841) 评论(2) 编辑 收藏 举报