在MVC中删除项目的最佳方法是什么?我有一个项目清单.每行都包含一个"删除"链接.我希望删除链接提示确认,然后从数据存储区中删除该项目并使用新数据刷新页面.
这是我的观看代码:
<%: Ajax.ActionLink(
"Delete"
,"Delete"
, new { id=item.FooId}
, new AjaxOptions()
{
Confirm="Are you sure that you want to delete this item?"
, HttpMethod = "post"} ) %>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器代码:
[HttpPost]
public ActionResult Delete(int id)
{
try
{
var success = FooService.Deletefoo(id);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
该记录正在删除,但页面不刷新.我唯一能想到的是RedirectToAction只适用于不同的页面,而不适用于同一页面.
如何刷新页面?
UPDATE
我最初的假设是可选参数是问题的原因.这似乎是不正确的.相反,当其中一个方法包含某些参数的可空值类型(例如int?)时,它似乎是多个动作方法的问题.
我正在使用Visual Studio 2012 RC,我刚刚开始使用Web API.我遇到了一个问题,并收到错误"在控制器上找不到与请求相匹配的'Bars'."
我有一个Bars控制器.它有一个Get()方法,它接受可选参数.
public IEnumerable<string> Get(string h, string w = "defaultWorld", int? z=null)
{
if (z != 0)
return new string[] { h, w, "this is z: " + z.ToString() };
else
return new string[] { h, w };
}
Run Code Online (Sandbox Code Playgroud)
所以,我用以下网址测试它
它适用于所有三个.
然后,我去添加另一个Get()方法,这次使用一个id参数
public string Get(int id)
{
return "value";
}
Run Code Online (Sandbox Code Playgroud)
我再次测试网址.这个时间/ api/bars?h =你好&w = world和api/bars?h =你好失败.错误消息"在控制器'Bar'上找不到与请求匹配的操作."
出于某种原因,这两种方法并不能很好地协同工作.如果我删除Get(int …
我们运行了一个Web API站点,它将用于多种用途:
我基于此链接创建了一个自定义RSS 2.0,并在WebApiConfig中进行了配置
public static void Register(HttpConfiguration config)
{
config.Formatters.Add(new SyndicationMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)
它接受application/rss + xml和application/atom + xml的接受头.
用户通常将RSS提要粘贴到他们的rss客户端,而不知道任何关于标题的内容 - 所以我需要有一些默认的RSS路由.
但是,这是棕色字段开发,json供稿已经在使用中,目前作为默认值,我无法在整个站点中更改默认格式化程序,而不会对现有开发人员客户端产生负面影响.
我可以将其作为特定控制器的默认格式化程序,但不能作为整个站点的默认格式化程序吗?
所以nHibernate 2.1 Alpha几天前问世了,但是sourceforge上的公告并未提及其他功能.特别是,它没有提到是否包括LINQ.我知道我已经读过LINQ将成为2.1的一部分,但那是6个月前.有人知道LINQ是2.1还是新功能?在官方网站上没有关于2.1 alpha功能的文档.
题
创建假货时如何处理只读字段?
背景
我正处于使用ASP.Net MVC的初学阶段,我正在使用Steven Sanderson的体育用品店和Scott Gu的书呆子晚餐作为例子.我刚刚遇到的一个小问题是如何在做假货时使用只读属性.我正在使用LINQToSQL.
我的界面是:
public interface IPersonRespository
{
Person GetPerson(int id);
}
Run Code Online (Sandbox Code Playgroud)
而我的假装变成了
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题.字段id,ssn和totalDrWhoEpisodesWatched是只读的,因此上面的代码实际上不起作用.但是,我不知道如何创建假新人并设置只读属性.我确信有一个解决方案,但我在搜索中还没有遇到过它.
更新:继承+属性隐藏为潜在的解决方案?
我还没有决定解决这个问题.我不喜欢为了创造假货而修改我的Domain类的概念.对我来说,为了进行测试而向域类添加标记是一种额外的耦合形式 - 与测试的实现相结合.我现在正在研究另一种可能性,即创建一个继承自Person的FakePerson类,但使用新的读写属性隐藏属性.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这个解决方案就是我的倾向.它确实打破了Liskov替换原则,但是这并没有在测试项目中给我带来太多麻烦.我很高兴听到任何批评和/或反馈作为解决方案.
获奖者:模拟框架
Moq似乎完成了这项工作.事实上,我通过继承隐藏属性的最后一个解决方案确实有效,但是通过使用Moq,我获得了一组更易于维护的标准化功能.我假设其他模拟框架具有此功能,但我没有检查.据说Moq开始模拟写作更直接,我现在肯定是这样.
背景
我们的网站上有一些链接,其格式如下:
http://oursite.com/books/c_sharp_in_depth_12345.
为了解决这个问题,我们使用了一个简单的属性Url:
public class Book
{
public string Url { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
基本上,URL来自我们网站的域名,网站的一部分(即书籍),页面名称和标识资源的唯一ID.完整的URL存储在数据库中.
我们不喜欢我们的数据库存储节名称这一事实.这是Web图层属性的属性,而不是本书的属性.数据库不应该依赖于Web层.
因此,我们从URL中删除该部分并获取以下内容:
public class Book
{
public string UrlWithoutSection { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
好的,适用于此URL.但是后来我们公司的SEO沙皇说我们的网址是错误的,如果我们重新编写这样的网址,谷歌,我们唯一的真爱,只会爱我们:
http://oursite.com/programming-books/c-sharp-in-depth-12345
呃,我以为我们已经删除了对Web层的数据库依赖,但我们没有.事实证明,我们已经删除了对该部分的依赖性,但URL的格式仍然存在于数据库中.我们通过将URL抽象为对象来解决此问题:
public class OurUrl
{
public string title { get; set; }
public string id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
很酷,现在对web层的依赖性消失了.哦,这次我们的首席执行官来找我们.我们刚刚买了一家新公司,现在我们正在销售杂志.呃,好吗?杂志网址将如下所示:
http://oursite.com/magazines/computers/stack-overflow-the-magazine/2012/01/01/12345
好的,没问题,只需创建另一个对象.
public class OurMagazineUrl : OurUrl
{
public DateTime PublishedDate { get; set; }
// Magazine enum will have to be created.
public MagazineType …Run Code Online (Sandbox Code Playgroud) ASP.Net控件(例如asp:Label)生成凌乱的html id(例如ct100_ct100_Yabba_Dabba_Doo_FinallyTheRealId).是的,他们很难看,但今天有人告诉我他们也是:
我半信半疑,一半不相信.我知道某些id名称(例如"header")是搜索引擎用来生成元信息的关键字,但我更怀疑id ="author"的跨度确实会影响SEO.我愿意承认我错了.
在第2点),我至少90%持怀疑态度.大多数页面大小不是html字符,我真的想知道100个更长的ID是否会为页面大小增加1kb.
我可以采用两种方法中的一种.你会采取哪种方法?
方法1)
<asp:Label id="lblAuthor" runat="server"></asp:Label>
Run Code Online (Sandbox Code Playgroud)
代码背后
protected void Page_Load(object sender, EventArgs e)
{
lblAuthor.Text = "Superman";
Run Code Online (Sandbox Code Playgroud)
或 方法2)
<span id="author"><%# Eval("Author") %></span>
Run Code Online (Sandbox Code Playgroud)
代码背后
public string Author { get; private set; }
protected void Page_Load(object sender, EventArgs e)
{
Author = "Superman";
Run Code Online (Sandbox Code Playgroud)
一方面,1)不会产生令人讨厌的ID.另一方面,我总是讨厌asp.net web表单中的无类字符串,并尽可能避免使用它们.此外,如果一个页面有30多个元素,我最终会有30个页面属性,这让我感到不安.(旁注:喜欢模型在MVC模式中的工作原理).
我们正在使用.Net 3.5.
你的想法是什么?
谢谢.
我有一个通用的扩展方法
public static IList<T> Replace<T>(this IList<T> source, Ilist<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)
我打电话使用
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff());
Run Code Online (Sandbox Code Playgroud)
但我意识到,我的方法适用于实现ICollection的所有集合,因此我将其更改为
public static ICollection<T> Replace<T>(this ICollection<T> source, ICollection<T> newList) where T:IStateful
Run Code Online (Sandbox Code Playgroud)
但是,现在该方法返回IColllection,这迫使我将调用写为:
myStatefulSetOfStuff = myStatefulSetOfStuff.Replace(GetNewSetOfStuff()).ToList();
Run Code Online (Sandbox Code Playgroud)
如何重新编写我的方法,以便我不需要.ToList()打电话?
编辑:有些混乱,所以我会尝试清理它.我有一份清单.我想用新列表在该列表上执行操作.没问题.我想出了如何使用扩展方法返回List.
但是我意识到,嘿,Replace()中的实际代码并不特定于Lists,它可以应用于任何集合.所以我修改了Replace以返回ICollection.这会强制调用方法看起来像
var newStuff = left.Replace(right).ToList()
Run Code Online (Sandbox Code Playgroud)
要么
var newStuff = left.Replace(right).ToArray()
Run Code Online (Sandbox Code Playgroud)
等等
但我不想说ToList,ToArray等,我希望该方法只是从源对象推断出正确的返回类型.所以我可以说
var newStuff = left.Replace(right);
Run Code Online (Sandbox Code Playgroud)
和newStuff的类型与左边相同.右边也是同一类型.
我正在使用Visual Studio 2012 RC.我使用默认路由并具有以下Web API控制器:
public class FooController : ApiController
{
// GET api/foo
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/foo/5
public string Get(int id)
{
return "value";
}
// POST api/foo
public string Post(string abc)
{
Console.WriteLine("value: {0}", abc);
return "foo" + abc;
}
// PUT api/foo/5
public void Put(int id, string value)
{
}
// DELETE api/foo/5
public void Delete(int id)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我想在Fiddler做一个简单的POST测试,所以我有
请求标头
用户代理:Fiddler
内容类型:application/json
请求正文
{"abc":"def"} …
c# ×3
asp.net-mvc ×2
architecture ×1
asp.net ×1
dynamic ×1
expando ×1
fiddler ×1
generics ×1
linq ×1
nerddinner ×1
nhibernate ×1
seo ×1
tdd ×1
testing ×1
url ×1
webforms ×1