Курсовая работа, первый asp,net проект и не работает процедура в коде должным образом.
Мне кажется в asp.net нужно иначе работать с хранимыми процедурами в бд но не понимаю как.
Используется Entity 6 (НЕ Core).
Модель принимается как null и выдает
User Lookup Results No users found for the specified email.
т.к. модель null
рут:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Translaters_Agency
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "UserLookup",
url: "UserLookup/{action}/{id}",
defaults: new { controller = "UserLookup", action = "FindUserByEmail", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
}
Data Context:
using Data.Models;
using System.Collections.Generic;
using System.Data.Entity;
namespace Data
{
public class DataContext : DbContext
{
public DataContext() : base("DefaultConnection")
{
}
public DbSet<User> Users { get; set; }
public DbSet<Translator> Translators { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<Comment> Comments { get; set; }
public DbSet<Certificate> Certificates { get; set; }
public DbSet<Rating> Ratings { get; set; }
public DbSet<MarketingCalendar> MarketingCalendars { get; set; }
public DbSet<FileTableModel> Files { get; set; }
public DbSet<Payment> Payments { get; set; }
public DbSet<TranslatorOrder> TranslatorOrders { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
}
namespace Data.Modelsnamespace Data.Models
{
public class UserSearchResultModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
}
{
public class UserResultViewModel
{
[Required(ErrorMessage = "Email is required")]
[EmailAddress(ErrorMessage = "Invalid email address")]
public string Email { get; set; }
public int Id { get; set; }
public string Name { get; set; }
}
}
Контроллер:
using Data.Models;
using Data;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Mvc;
using System;
using System.Linq;
[RoutePrefix("UserLookup")]
public class UserLookupController : Controller
{
private readonly DataContext _context;
public UserLookupController()
{
_context = new DataContext();
}
[HttpGet]
[Route("FindUserByEmail")]
public ActionResult FindUserByEmail()
{
// экземп модели с дефолтными значениями
var defaultModel = new UserResultViewModel
{
Email = "user5@example.com"
};
// модель в представление
return View(defaultModel);
}
[HttpPost]
public ActionResult FindUserByEmail(UserResultViewModel model)
{
try
{
if (ModelState.IsValid)
{
System.Diagnostics.Debug.WriteLine($"Input Email: {model.Email}");
SqlParameter param = new SqlParameter("@Email", model.Email);
IEnumerable<UserSearchResultModel> results = _context.Database.SqlQuery<UserSearchResultModel>("EXEC FindUserByEmail @Email", param).ToList();
System.Diagnostics.Debug.WriteLine($"Number of Results: {results?.Count()}");
// Перенаправление на представление с результатом
return View("UserLookupResult", results);
}
System.Diagnostics.Debug.WriteLine("Model state is not valid");
return View(model);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Exception: {ex.Message}");
// Обработка ошибок, если необходимо
ViewBag.ErrorMessage = ex.Message;
return View("Error");
}
}
[HttpGet]
[Route("UserLookupResult")]
public ActionResult UserLookupResult(IEnumerable<UserSearchResultModel> results)
{
return View(results);
}
}
Представление:
@model IEnumerable<Data.Models.UserSearchResultModel>
@{
ViewBag.Title = "User Lookup Results";
}
<h2>User Lookup Results</h2>
@if (Model != null)
{
<table class="table">
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
@foreach (var user in Model)
{
<tr>
<td>@user.Id</td>
<td>@user.Name</td>
<td>@user.Email</td>
</tr>
}
</table>
}
else
{
<p>No users found for the specified email.</p>
}
<p>@Html.ActionLink("Back to Search", "FindUserByEmail")</p>
Сама процедура прекрасно работает в БД.
use Translaters_Buro
go
ALTER PROCEDURE [dbo].[FindUserByEmail]
@Email NVARCHAR(100)
AS
BEGIN
SELECT Id, Name, Email
FROM Users
WHERE Email = @Email;
END;
exec FindUserByEmail 'user5@example.com'
Пробовал ловить ошибки, менять структуру процедуры, брать данные напрямую из основной модели.
EXEC. – Alexander Petrov Jan 30 '24 at 21:21