如何在没有ef的情况下使用MVC5中的参数进行搜索

时间:2016-05-22 16:28:18

标签: c# .net sql-server asp.net-mvc model-view-controller

如果我有人可以帮助我如何在不使用实体框架的情况下在MVC 5中创建搜索页面,我将很高兴。如果用户输入产品名称并发布,则结果将显示在GridViewInputBox / Label中,以显示单行。我在后端使用C#和SQLServer。我只是MVC和C#的初学者。

我创建了一个控制器,如下所示;

{
  connect pcon = new connect();
  using (SqlConnection conn = new SqlConnection(pcon.CS))
  {
    try
    {
      //do something
      pcon.cmd.CommandText = "SELECT * FROM tbproduct WHERE itemName=@name)";
      pcon.cmd.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.NVarChar, 50));
      pcon.cmd.Parameters["@name"].Value = p.itemName;
      pcon.cmd.Connection = conn;
      conn.Open();
      datagridview = pcon.cmd.ExecuteReader();
      TempData["Success"] = "Record Added Sucessfully.";
      return RedirectToAction("Index", "Product");
    }
    catch (Exception ex)
    {
      // throw ex;
      // return RedirectToAction("Index", "Product");
      return View("Error", new HandleErrorInfo(ex, "Product", "AddProduct"));
    }    // end of try-catch
  }      // end of using
}        // end of spurious open bracket

有了这个,我不知道如何将它传递给视图以获得有意义的结果。 谢谢

2 个答案:

答案 0 :(得分:0)

您可以从ExecuteReader对象获取结果并将其传递给您的视图。我还建议对应用程序的体系结构进行一些更改。

首先,我将拥有一个ViewModel类,它捕获您希望传递给View的实体。类似的东西:

public class ProductViewModel
{
    private ProductService _productService = new ProductService();

    public IEnumerable<Product> GetProducts(string name)
    {
       return _productService.GetProducts(name);
    }
}

我建议将ADO.NET代码(SqlConnection,SqlCommand)放入不同的层,即数据访问层或ProductService。

public class ProductService
{
    public IEnumerable<Products> GetProducts(string name) 
    {
       List<Products> products = new List<Products>();
       using (SqlConnection conn = new SqlConnection(pcon.CS))
       {
          // Your code here
          // Build up the products list from the SQL data reader
       }
       return products;
    }
}

这将使您的控制器保持轻盈,不受业务逻辑的影响。

在您的控制器中,您将拥有:

public ActionResult GetProduct(string product)
{
    ProductViewModel model = new ProductViewModel();
    var products = model.GetProducts(product);

    return View(products);
}

然后在你的View(.cshtml)文件中,你将遍历IEnumerable集合(你没有像网格视图那样的服务器端控件),因此你可以构建自己的。

@model IEnumerable<Product>
@foreach(var product in Model)
{
   @product.name
}

作为附加说明,您可能需要考虑使用ORM,例如Entity Framework或nHibernate,它们可以为您提供所有令人振奋的功能。

答案 1 :(得分:0)

实际上你的控制器方法需要采取一些搜索参数来搜索并返回结果。

您还可以根据要在视图上显示的属性/字段创建视图模型,然后将结果映射到viewmodel并将其返回。

public ActionResult DoSearch(string searchString) 
{           
    var movies = <get the movie list>; 

    if (!String.IsNullOrEmpty(searchString)) 
    { 
        movies = movies.Where(s => s.Title.Contains(searchString)); 
    }

    return View(movies); 
}

在视图中,您可以通过循环显示结果的模型来创建表。

@model IEnumerable<MvcMovie.Models.Movie> 
@  
if (Model.Count() == 0)
{
  <tr>
  <td colspan = "3" >Records not found</td>  
  </tr >  
}
else 
{      
    foreach(var item in Model) 
    { 
    <tr>
    <td> @Html.DisplayFor(modelItem = > item.MovieName)</td>            
    <td> @Html.DisplayFor(modelItem => item.ReleaseDate)</td>          
    </tr >  
    }  
}

要显示更具吸引力和用户友好的表格,您也可以使用IPagedList

查看http://www.asp.net/mvc/overview/getting-started/introduction/adding-search教程。